文档说明,使用Predicate的第二个重载可用于避免虚假唤醒。我没有看到它,我如何修改我的代码以确保wait_for不被虚假地唤醒?忽略虚假唤醒,condition_variable :: wait_for
while(count_ > 0) {
if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) ==
std::cv_status::timeout)
break;
}
文档说明,使用Predicate的第二个重载可用于避免虚假唤醒。我没有看到它,我如何修改我的代码以确保wait_for不被虚假地唤醒?忽略虚假唤醒,condition_variable :: wait_for
while(count_ > 0) {
if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) ==
std::cv_status::timeout)
break;
}
的文件有误导性:有可能spurios唤醒,但wait_for()
与谓词将只返回时谓词我们true
。也就是说,在使用谓词版本时,看起来好像没有虚假的唤醒。通过记录谓词执行的频率,您可以检测是否存在虚假唤醒。
你会使用它像
if (condition_.wait_for(lock,
std::chrono::milliseconds(timeOut_),
[&](){ return count_ <= 0; }) ==
std::cv_status::timeout) {
// deal with timeout here
}
尽管如此,这种区别在使用超时时很重要,这取决于您的超时需求,如果虚假唤醒发生,您必须重新计算超时时间 - 这可能不会导致wait_for()超载揭露虚假的唤醒会为你做。 – nos
@nos我不认为它实际上重新计算了超时时间,看看wait_until文档,它看起来像只是重新启动计时器。 –
@SteveM:根据30.5.1 [thread.condition.condvar] paragragh 38,对'wait_for()'的调用相当于对'wait_until()'的调用,计算时间为“chrono :: steady_clock :: now ()+ rel_time'。因此,它不会重新计算相对时间,但它也不会以相同的超时时间重新开始计算。 –
与谓词超载本质上是做循环为您服务。 –
将一个lambda作为谓词,如[参考示例](http://en.cppreference.com/w/cpp/thread/condition_variable/wait_for)所示。 –