文档说使用谓词的第二次重载可以用来避免虚假的唤醒。我没有看到它,我如何修改我的代码以确保wait_for没有被虚假唤醒?
while(count_ > 0) {
if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) ==
std::cv_status::timeout)
break;
}
答案 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
}