【问题标题】:Condition variables条件变量
【发布时间】:2011-04-19 05:53:35
【问题描述】:

我注意到,当我对条件变量执行等待操作时,它会立即返回。结果是,当执行以下虚拟代码时,一个 CPU 的 100% 正在循环中使用:

int main(void) {

boost::condition_variable cond;
boost::mutex mut;
bool data_ready = false;

boost::unique_lock<boost::mutex> lock(mut);
while (!data_ready) {
    cond.wait(lock);
}


return 1;

}

我希望对cond.wait(lock) 的调用将线程置于不消耗任何CPU 的状态,但事实并非如此。

那么问题出在哪里?我从 boost 文档中获取了上面的代码。

(我使用的是 boost 1.44)

谢谢,

纪尧姆

【问题讨论】:

    标签: c++ multithreading boost boost-thread condition-variable


    【解决方案1】:

    condition_variable::wait 可能会虚假地返回。也就是说,没有被通知。虚假返回的频率取决于实施的质量。

    在我的机器上,我获取了您的代码,将其更改为使用 std::condition_variable(C++11 中的新功能),然后运行它。它挂起,没有使用 cpu。

    听起来像是 boost 实现,在你的平台上(boost 对 windows 和 pthread 有不同的实现),虚假地唤醒自己以确保它不会错过任何通知。

    【讨论】:

    • “虚假”事件是每个土星与木星对齐的事件。这是值得一提的,但它不应该用来证明这种情况。例如,当引发系统异常(sigbus 或某些信号)时,可能会发生虚假唤醒。这不会一直发生,他还有其他问题。
    【解决方案2】:

    由于程序中没有其他线程,线程库从 pthread_cond_wait() 立即返回是非常明智的,否则您的程序将永远休眠。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2015-05-25
      • 2013-04-01
      相关资源
      最近更新 更多