C++ std::condition\u variable\u是否有不恰当的语义?

C++ std::condition\u variable\u是否有不恰当的语义?,c++,c++11,C++,C++11,使用POSIX条件变量,您可以编写如下内容: while (!_doneWaiting) { wait(lock); } 起初,当我看到新的C++11样式时,我很激动: unique_lock<recursive_mutex> g(_consumerCondLock); _consumerCond.wait( g, [this]() { return _doneWaiting; } ); unique_lock g(_consumerCondLock); _con

使用POSIX条件变量,您可以编写如下内容:

while (!_doneWaiting) {
    wait(lock);
}
起初,当我看到新的C++11样式时,我很激动:

unique_lock<recursive_mutex> g(_consumerCondLock);
_consumerCond.wait( g, [this]() {
    return _doneWaiting;
} );
unique_lock g(_consumerCondLock);
_consumerCond.wait(g,[this](){
返回_doneWaiting;
} );
但我遇到了一个麻烦:上面的谓词lambda是否保证在任何等待发生之前运行一次

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

必须检查您等待的条件:

  • 在等待条件变量之前
  • 等待条件变量后,因为
  • 这就是为什么等待条件变量的标准形式是
    while
    循环:

    // lock the mutex
    while(!condition)
        // wait on the condition variable
    
    这就是
    std::condition\u variable::wait
    为您所做的



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

    是的,它必须在等待之前运行。如果我们看参考文献(它与C++标准部分草案<代码> 30.5.2类条件变量>任何< < /代码>)一致,它表示:

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

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

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