等待条件的线程的有序通知(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)的主要内容,如果未能解决你的问题,请参考以下文章