我目前正在研究std :: condition_variable。在while循环中使用std :: condition_variable :: wait()完全不依赖std :: condition_variable :: notify()是否正确?
每个std :: condition_variable :: wait()都应强制具有std :: condition_variable :: notify()吗?
答案 0 :(得分:5)
您可以循环使用它,并且您依赖notify()
。
问题是允许条件变量“虚假地”唤醒,即不发出信号。这使实现起来更容易,但是它要求您检查自己是否确实在您认为的位置。因此,您编写了一个循环:
std::unique_lock<std::mutex> lk(some_mutex);
while (condition_not_satisfied())
cond_var.wait(lk);
some_mutex
为条件中使用的变量提供关键区域。
或者,正如Slava指出的那样,您可以使用谓词版本:
std::unique_lock<std::mutex> lk(some_mutex);
cond_var.wait(lk, some_callable_object_that_checks_the_predicate);
(我从不喜欢这种形式,所以我往往会忘记它)