忽略虚假的唤醒,condition_variable :: wait_for

时间:2015-11-08 16:02:00

标签: c++ c++11 condition-variable

文档说使用谓词的第二次重载可以用来避免虚假的唤醒。我没有看到它,我如何修改我的代码以确保wait_for没有被虚假唤醒?

while(count_ > 0) {
    if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) ==
            std::cv_status::timeout)
        break;
}

1 个答案:

答案 0 :(得分:1)

文档具有误导性:可能有spurios唤醒,但带有谓词的wait_for()只会在谓词为true时返回。也就是说,当使用谓词版本时,它看起来好像没有虚假的唤醒。您可以通过记录谓词执行的频率来检测是否存在虚假的唤醒。

您可以像

一样使用它
if (condition_.wait_for(lock,
                        std::chrono::milliseconds(timeOut_),
                        [&](){ return count_ <= 0; }) ==
        std::cv_status::timeout) {
    // deal with timeout here
}