什么时候可以在没有谓词的情况下使用 std::condition_variable

When can std::condition_variable be used without a predicate?

本文关键字:std condition variable 情况下 谓词 什么时候      更新时间:2023-10-16

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

假设一个复杂的条件A || B 。当条件的任何部分为真时,应执行适当的操作,actionAactionB

使用谓词版本,代码可能如下所示:

cond.wait(lock, []{return (A || B);});
if(A) {
    actionA();
}
else {
    actionB();
}

但是如果使用非谓词等待,代码可能会更快

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

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

在更复杂的情况下,条件不能写在单个表达式中。

为什么C++标准库提供没有谓词的wait()方法重载

wait 的谓词版本等效于:

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

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

我想在某些情况下,虚假唤醒并不是世界末日。

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

给定虚假唤醒,它偶尔可能会收获少于 100 条消息。 这种差异可能不保证条件函数的开销和额外复杂性。