等待条件的线程的有序通知(C++,boost)

Posted

技术标签:

【中文标题】等待条件的线程的有序通知(C++,boost)【英文标题】:Ordered notification of threads waiting on a condition (C++, boost) 【发布时间】:2013-12-26 19:41:49 【问题描述】:

有谁知道一个条件变量类,它允许按照线程开始等待的顺序通知等待条件的线程?

我目前正在使用 boost 类 condition_variable,但调用 condition_variable::notify_one() 会唤醒一个随机线程,而不是首先调用 condition_variable::wait() 的线程。我还尝试在调用condition_variable::wait() 之前将线程ID 添加到队列中,这样我就可以调用condition_variable::notify_all(),此时所有等待的线程都会唤醒,检查队列并再次等待或继续(只有一个线程,即第一个线程队列)。问题是调用notify_all() 两次并不能保证所有线程都被唤醒两次,从而丢失通知。有什么建议吗?

【问题讨论】:

【参考方案1】:

奇怪的是,您需要按特定顺序唤醒线程并且听起来对您的设计感到怀疑。无论如何,想法是您可以拥有条件变量队列(每个线程一个),并且您可以从队列顶部调用notify_one()。在等待线程中,您需要执行额外的逻辑来检查它是否没有偶尔因等待而中断。再次听起来很奇怪,为什么您需要线程以特定顺序唤醒,您可能需要重新考虑您的设计。

【讨论】:

是的,我想这会起作用,但你是对的,这可能是一个设计问题。我有一个线程在事件循环中处理串行端口读/写。此循环还检查我从不同线程向自己发送信号的写入事件。这些线程现在等待响应,第一个响应属于导致第一个写入事件的线程,因此是我要求的有序信号。 你的整体设计很糟糕,正如@Slava所描述的那样

以上是关于等待条件的线程的有序通知(C++,boost)的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程之三volatile与等待通知机制示例

C++笔记--条件变量

C++笔记--条件变量

高并发场景下优化加锁方式:线程等待与通知机制

如何通知尾部更新到 C++ 窗口中的线程? [读取全局变量的未缓存值]

如何修复条件变量等待/通知的竞争条件