在while循环内使用std :: condition_variable :: wait是否正确?

时间:2019-07-24 13:38:15

标签: c++ c++11 thread-safety condition-variable

我目前正在研究std :: condition_variable。在while循环中使用std :: condition_variable :: wait()完全不依赖std :: condition_variable :: notify()是否正确?

  

每个std :: condition_variable :: wait()都应强制具有std :: condition_variable :: notify()吗?

1 个答案:

答案 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);

(我从不喜欢这种形式,所以我往往会忘记它)