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

时间:2016-01-26 11:30:34

标签: c++ multithreading c++11 condition-variable spurious-wakeup

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

3 个答案:

答案 0 :(得分:6)

假设复杂条件:A || B。如果某些条件成立,则应执行适当的操作actionAactionB

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

cond.wait(lock, predAB);
if(A) {
    actionA();
}
else {
    actionB();
}

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

while(true)
{
    if(A) {
         actionA();
         break;
    }
    else if(B) {
         actionB();
         break;
    }
    cond.wait(lock);
}

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

当条件无法写入一个表达式时,有更复杂的情况。

答案 1 :(得分:3)

我猜有些情况下,虚假的唤醒不是世界末日。

,例如,考虑一个生产者 - 消费者批处理系统,其中一些线程应该在队列中至少有100条消息时唤醒,并处理它们。

鉴于虚假的唤醒,它偶尔会收到少于100条消息。差异可能无法保证条件函数的开销和额外的复杂性。

答案 2 :(得分:3)

  

为什么C ++标准库提供没有谓词

的wait()方法的重载

The predicate version of wait相当于:

while (!pred()) {
    wait(lock);
}

如果您需要在等待之前和/或之后执行更复杂的代码,您可能希望在没有谓词的情况下使用wait