何时可以在没有谓词的情况下使用std :: condition_variable?

und*_*ind 5 c++ multithreading condition-variable c++11 spurious-wakeup

如果std::condition_variable由于虚假的唤醒可以发出信号(我们无法确定我们需要的条件是否真的满足),为什么C++标准库提供wait()没有谓词的方法的重载?可以使用此类行为的情况是什么?

Tsy*_*rev 6

假设复杂的条件:A || B.当条件的某些部分为真时,应采取适当的行动,actionA或者actionB应该执行.

使用谓词版本,可以遵循代码(predAB()评估条件):

cond.wait(lock, predAB);
if(A) {
    actionA();
}
else {
    actionB();
}
Run Code Online (Sandbox Code Playgroud)

但是非谓词等待的代码可能会更快:

while(true)
{
    if(A) {
         actionA();
         break;
    }
    else if(B) {
         actionB();
         break;
    }
    cond.wait(lock);
}
Run Code Online (Sandbox Code Playgroud)

注意,与第一个变体不同,现在每个条件部分都被评估一次.

当条件不能写入一个表达式时,有更复杂的情况.