C++ std::condition\u variable\u是否有不恰当的语义?
使用POSIX条件变量,您可以编写如下内容: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
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);
}