c – 了解std :: condition_variables

weixin_38087646 2019-09-12 12:11:53
当我有多个线程等待执行时,我正在尝试理解condition_variable的流程.根据我的理解,所有线程都会尝试获取唯一的锁,一个会得到它然后进入wait(),如果你调用notify_all,最多不会有一个线程等待允许通过.直到它释放它的锁并允许其他线程通过. cv是否与唯一锁通信并让所有线程同时通过所有线程?如果是这样的话,它确实是一次性的,或者线程是否依次顺序通过. std::condition_variable cv; std::mutex cv_m; // This mutex is used for three purposes: // 1) to synchronize accesses to i // 2) to synchronize accesses to std::cerr // 3) for the condition variable cv int i = 0; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cerr << "Waiting... \n"; cv.wait(lk, []{return i == 1;}); std::cerr << "...finished waiting. i == 1\n"; } http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all
...全文
13 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38088019 2019-09-12
  • 打赏
  • 举报
回复
当您调用wait(单参数版本)时,锁定被解锁并且线程进入等待状态,直到CV被“通知”.当一个线程被唤醒时,锁被再次锁定. 当您拨打notify_one时,基本上会在CV上等待随机线程.当您调用notify_all时,等待CV的所有线程将从等待状态唤醒,锁定锁定的第一个线程将继续.这将是随机的. 请注意,当我说“随机”时,系统上的线程(从C库到操作系统内核甚至硬件)的实际实现可能会以某种方式实现,以便可以推断出哪个线程将是醒来并获得锁定的那个,但从使用条件变量的应用程序编写者的角度来看,没有预定的顺序,它是随机的.

473

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧