忽略虚假唤醒,condition_variable::wait_for

Ignore spurious wakeups, condition_variable::wait_for

本文关键字:variable wait for condition 唤醒      更新时间:2023-10-16

文档指出,可以使用谓词的第二个重载来避免虚假唤醒。我没有看到,我如何修改我的代码以确保wait_fo不会被错误地唤醒?

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

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

你会像一样使用它

if (condition_.wait_for(lock,
                        std::chrono::milliseconds(timeOut_),
                        [&](){ return count_ <= 0; }) ==
        std::cv_status::timeout) {
    // deal with timeout here
}
相关文章: