如果由于虚假的唤醒可以发出std::condition_variable
信号(我们无法确定我们需要的条件是否真的满足),为什么C ++标准库提供{{1}的重载没有谓词的方法?什么情况下可以使用这种行为?
答案 0 :(得分:6)
假设复杂条件:A || B
。如果某些条件成立,则应执行适当的操作actionA
或actionB
。
使用谓词版本,可以遵循代码(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
。