C++ 忽略虚假唤醒,条件变量::等待
文档说明,谓词的第二个重载可用于避免虚假唤醒。我没有看到它,如何修改代码以确保wait_for不会被错误唤醒C++ 忽略虚假唤醒,条件变量::等待,c++,c++11,condition-variable,C++,C++11,Condition Variable,文档说明,谓词的第二个重载可用于避免虚假唤醒。我没有看到它,如何修改代码以确保wait_for不会被错误唤醒 while(count_ > 0) { if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) == std::cv_status::timeout) break; } 该文档具有误导性:可能存在spurios唤醒,但是带有谓词的wait_for()仅在谓
while(count_ > 0) {
if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) ==
std::cv_status::timeout)
break;
}
该文档具有误导性:可能存在spurios唤醒,但是带有谓词的
wait_for()
仅在谓词ustrue
时才会返回。也就是说,当使用谓词版本时,似乎没有虚假的唤醒。您可以通过记录谓词执行的频率来检测是否存在虚假唤醒
你会像这样使用它
if (condition_.wait_for(lock,
std::chrono::milliseconds(timeOut_),
[&](){ return count_ <= 0; }) ==
std::cv_status::timeout) {
// deal with timeout here
}
if(条件)等待(锁定、,
std::chrono::毫秒(超时),
[&](){return count_uuu将lambda作为谓词,如中所示。不过,在使用超时时,区别是很重要的,这取决于您对超时的要求,您必须重新计算超时,以防发生错误唤醒-这(可能)是等待()不暴露虚假唤醒的重载对您有帮助。@不,我不认为它实际上会重新计算超时,看看wait_,直到文档,它看起来只是重新启动计时器。@SteveM:根据30.5.1[thread.condition.condvar]paragragh 38调用wait_for()
相当于调用wait_until()
,计算的时间为chrono::staid_clock::now()+rel_time
。因此,它不会重新计算相对时间,但也不会在相同的超时情况下重新启动。