C++ std::condition_variable notify_one()与notify_all()的作用
Posted 软件工程小施同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ std::condition_variable notify_one()与notify_all()的作用相关的知识,希望对你有一定的参考价值。
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
以上是关于C++ std::condition_variable notify_one()与notify_all()的作用的主要内容,如果未能解决你的问题,请参考以下文章
[C++]C++入门到入土篇 HelloWorld 解析 && C++入门