繁体   English   中英

如果有很多线程在等待通知,std::condition_variable::notify_one() function 通知哪一个?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM