C++中的多线程,只检查信号量是不是被锁定

Posted

技术标签:

【中文标题】C++中的多线程,只检查信号量是不是被锁定【英文标题】:Multithreading in C++, only check if semaphore is lockedC++中的多线程,只检查信号量是否被锁定 【发布时间】:2014-07-24 23:26:46 【问题描述】:

我正在尝试使用 c++ 解决我在 Windows 上遇到的问题。

假设我有线程 A B C 和线程 Z。 A B C 和 Z 都通过套接字向应用程序发送数据。但是Z在传输数据的时候,我想让A B和C等Z完成,然后再继续。

A B C可以并发向应用发送数据。

我正在尝试使用互斥锁来防止 A B C 在 Z 运行时运行,但我发现即使 Z 没有运行,由于该互斥锁,A B C 也不会同时运行。

所以我的问题最终是,在 C++ 中是否有一种方法可以让我检查互斥锁是否被锁定,如果它被锁定,则等待互斥锁解锁,但 不要 锁定互斥体?

我从不希望 A、B 和 C 锁定互斥锁。只有 Z 应该锁定互斥锁。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

有一种称为"readers-writer lock" 的锁可以解决您的问题。它适用于可以有多个并发读取器但一次只有一个写入器(并且写入器锁定读取器)的对象。这听起来与您的应用程序非常相似,其中 A、B 和 C 被视为读取器,Z 被视为写入器。

【讨论】:

【参考方案2】:

看看Slim Reader/Writer locks - 正是医生所要求的。只需让线程 A、B 和 C 在工作时获取读锁,并让线程 Z 在其工作时获取写锁。

【讨论】:

以上是关于C++中的多线程,只检查信号量是不是被锁定的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的多个线程调用 Qt 中小部件类的信号函数是不是安全?

以下 C++ 代码中实现的 DCL(双重检查锁定)是不是是线程安全的?

分析多线程程序 [关闭]

FMDB 的多线程问题

我是不是需要锁定才能同时使用同一个应用程序两次写入套接字?

如何找到信号量未锁定的原因