【问题标题】:Ordered notification of threads waiting on a condition (C++, boost)等待条件的线程的有序通知(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() 两次并不能保证所有线程都被唤醒两次,从而丢失通知。有什么建议吗?

【问题讨论】:

    标签: c++ multithreading condition-variable


    【解决方案1】:

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

    【讨论】:

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