std::condition_variable_any是否有尴尬的语义?

Does std::condition_variable_any have awkward semantics?

本文关键字:语义 是否 condition variable any std      更新时间:2023-10-16

使用POSIX条件变量,您可以这样写:

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

一开始当我看到c++ 11的新风格时,我很兴奋:

unique_lock<recursive_mutex> g(_consumerCondLock);
_consumerCond.wait( g, [this]() {
    return _doneWaiting;
} );

但是一个烦恼发生在我身上:上面的谓词lambda保证在任何等待发生之前运行一次吗?

上面的谓词lambda是否保证在任何等待发生之前运行一次?

必须检查您等待的条件:

  1. 在等待条件变量之前。
  2. 由于虚假唤醒而等待条件变量后。

这就是为什么等待条件变量的标准形式是while循环:

// lock the mutex
while(!condition)
    // wait on the condition variable

这就是std::condition_variable::wait为你做的。


注意,大多数情况下您需要std::condition_variable而不是std::condition_variable_any。后者维护自己的互斥锁,并且在内存和运行时间方面更昂贵。

是的,它必须在等待之前运行。如果我们看一下std::condition_variable_any::wait的参考(与c++标准草案30.5.2 Class condition_variable_any 一致),它说:

template< class Lock, class Predicate >
void wait( Lock& lock, Predicate pred );

等价于:

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

说:

此重载可用于在等待特定条件变为真时忽略虚假唤醒。

相关文章: