您当前的位置: 首页 >  ar
  • 0浏览

    0关注

    1477博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++ std::condition_variable notify_one()与notify_all()的作用

软件工程小施同学 发布时间:2021-10-09 17:24:35 ,浏览量:0

notify_one()与notify_all()常用来唤醒阻塞的线程,线程被唤醒后立即尝试获得锁。

  • notify_one()因为只唤醒一个线程,不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,等待再次调用notify_one()或者notify_all()。
  • notify_all()会唤醒所有阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续尝试获得锁?答案是会阻塞,等待操作系统在互斥锁的状态发生改变时唤醒线程。当持有锁的线程释放锁时,操作系统会唤醒这些阻塞的线程,而这些线程会继续尝试获得锁。

因此,线程阻塞在条件变量时,等待notify_one()或者notify_all()来唤醒。线程被唤醒后,会尝试获得锁,如果未获得锁,会重新进入阻塞状态。

注意区分线程处理阻塞状态时,是由于等待条件阻塞或是尝试获得锁而阻塞。

  • 如果是因为等待条件变量阻塞,只能由notify_one()或者notify_all()来唤醒;
  • 如果是为尝试获得锁而阻塞,只能由操作系统在锁的状态发生变化时唤醒;  

———————————————— 版权声明:本文为CSDN博主「xupeng1644」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xp178171640/article/details/106016141

关注
打赏
1665320866
查看更多评论
立即登录/注册

微信扫码登录

0.0453s