![](/img/trans.png)
[英]std::condition_variable::notify_one: does it wake multiple threads if some have false predicate?
[英]If there are many threads are waiting to be notify, which one does the std::condition_variable::notify_one() function notify?
我正在编写一个 c++ 多线程程序,其中有多个线程等待通知。
std::mutex mutex;
std::condition_variable cv;
bool is_prepared = false;
bool is_fornt_left_finished = false;
bool is_fornt_right_finished = false;
bool is_back_left_finished = false;
thread t1(&Underpan::FrontLeft, this), t2(&Underpan::FrontRight, this),
t3(&Underpan::BackLeft, this), t4(&Underpan::BackRight, this);
is_prepared = true;
t1.join();
t2.join();
t3.join();
t4.join();
cv.notify_one(); // fail
// cv.notify_all(); // success
本来以为notify的顺序就是线程构造的顺序。 但是在实际运行中,程序偶尔能成功运行,也偶尔会卡住。
我查了官方文档,没有解释这部分细节。
顺序是否不可预测?
未指定将唤醒哪个线程。 它不需要任何特定的规则。 也不需要任何“顺序”。 它可以一直唤醒同一个线程(只要它在通知发生时一直在等待),也可以随机唤醒一个不同的线程。
当然,特定的标准库实现可能会做出一些保证,但我认为这不太可能。 实际上,实现可能只使用任何最有效的方法来实现std::condition_variable
,操作系统对线程的管理的不确定性也会影响它。
所以不要编写任何依赖于哪个线程将被唤醒的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.