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

Is it right to use std::condition_variable::wait inside a while loop?

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

Should each std::condition_variable::wait() mandatorily have std::condition_variable::notify() ?

你在循环中使用它,你依赖notify()

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

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

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