在 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);
(我从来不喜欢那种形式,所以我倾向于忘记它)
我目前正在研究 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);
(我从来不喜欢那种形式,所以我倾向于忘记它)