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++元宇宙

[C++]C++入门到入土篇 HelloWorld 解析 && C++入门

怎么找C++函数需要的头文件?(C++头文件C++函数文档C++文档)

如何识别项目是托管 c++ 项目还是非托管 c++ 项目

C++ 程序员应该使用哪些 C++ 习语? [关闭]

十类C++标准库 十类C++标准库简介