2015-11-08 72 views
1

文档说明,使用Predicate的第二个重载可用于避免虚假唤醒。我没有看到它,我如何修改我的代码以确保wait_for不被虚假地唤醒?忽略虚假唤醒,condition_variable :: wait_for

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

与谓词超载本质上是做循环为您服务。 –

+1

将一个lambda作为谓词,如[参考示例](http://en.cppreference.com/w/cpp/thread/condition_variable/wait_for)所示。 –

回答

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 
} 
+0

尽管如此,这种区别在使用超时时很重要,这取决于您的超时需求,如果虚假唤醒发生,您必须重新计算超时时间 - 这可能不会导致wait_for()超载揭露虚假的唤醒会为你做。 – nos

+0

@nos我不认为它实际上重新计算了超时时间,看看wait_until文档,它看起来像只是重新启动计时器。 –

+0

@SteveM:根据30.5.1 [thread.condition.condvar] paragragh 38,对'wait_for()'的调用相当于对'wait_until()'的调用,计算时间为“chrono :: steady_clock :: now ()+ rel_time'。因此,它不会重新计算相对时间,但它也不会以相同的超时时间重新开始计算。 –

相关问题