首页 > 解决方案 > 在 while 循环中使用 std::condition_variable::wait 是否正确?

问题描述

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

每个 std::condition_variable::wait() 是否应该强制具有 std::condition_variable::notify() ?

标签: c++c++11thread-safetycondition-variable

解决方案


您在循环中使用它,并且依赖notify().

问题是条件变量被允许“虚假地”唤醒,也就是说,没有发出信号。这使得它更容易实现,但它要求你检查你是否真的在你认为的位置。所以你写了一个循环:

std::unique_lock<std::mutex> lk(some_mutex);
while (condition_not_satisfied())
    cond_var.wait(lk);

Wheresome_mutex为条件中使用的变量提供了一个关键区域。

或者,正如 Slava 指出的那样,您可以使用谓词版本:

std::unique_lock<std::mutex> lk(some_mutex);
cond_var.wait(lk, some_callable_object_that_checks_the_predicate);

(我从来不喜欢那种形式,所以我倾向于忘记它)


推荐阅读