notify_one()notify_all()常用来唤醒阻塞的线程。

notify_one():因为只唤醒等待队列中的第一个线程;不存在锁争用,所以能够立即获得锁。其余的线程不会被唤醒,需要等待再次调用notify_one()或者notify_all()

notify_all()会唤醒所有等待队列中阻塞的线程,存在锁争用,只有一个线程能够获得锁。那其余未获取锁的线程接着会怎么样?会阻塞?还是继续尝试获得锁?

答案是会继续尝试获得锁(类似于轮询),而不会再次阻塞。当持有锁的线程释放锁时,这些线程中的一个会获得锁。而其余的会接着尝试获得锁。

看下面的例子:

// condition_variable example
#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variablestd::mutex mtx;
std::condition_variable cv;
bool ready = false;void print_id(int id) {std::unique_lock<std::mutex> lck(mtx);while (!ready) cv.wait(lck);// ...std::cout << "thread " << id << '\n';
}void go() {std::unique_lock<std::mutex> lck(mtx);ready = true;cv.notify_all(); // 这是重点
}int main()
{std::thread threads[10];// spawn 10 threads:for (int i = 0; i < 10; ++i)threads[i] = std::thread(print_id, i);std::cout << "10 threads ready to race...\n";go();                       // go!for (auto& th : threads) th.join();return 0;
}

运行结果为:

10 threads ready to race...
thread 2
thread 0
thread 9
thread 4
thread 6
thread 8
thread 7
thread 5
thread 3
thread 1

输出表明所有线程被唤醒,然后依旧获得了锁。

如果将go()中的cv.notify_all()改为cv.notify_one(),运行结果为:

10 threads ready to race...
thread 0

输出表明只有有一个线程被唤醒,然后该线程释放锁,这时锁已经处理非锁定状态,但是其余线程依旧处于阻塞状态。

所以,线程阻塞在condition_variable时,它是等待notify_one()或者notify_all()来唤醒,而不是等待锁可以被锁定来唤醒。
线程被唤醒后,会通过轮询方式获得锁,获得锁前也一直处理运行状态,不会被再次阻塞。

C++11条件变量:notify_one()与notify_all()的区别相关推荐

  1. C++11 条件变量

    目录 条件变量 1 成员函数 wait函数 wait_for函数 wait_until函数 notify_one函数 notify_all函数 2 Demo1 sync_queue.h conditi ...

  2. C++11条件变量使用详解

    condition_variable介绍 在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作:当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这 ...

  3. C++条件变量使用详解

    1. condition_variable介绍 在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作:当条件不满足时,相关线程被一直阻塞,直到某种条件出 ...

  4. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

  5. C++11学习笔记-----互斥量以及条件变量的使用

    在多线程环境中,当多个线程同时访问共享资源时,由于操作系统CPU调度的缘故,经常会出现一个线程执行到一半突然切换到另一个线程的情况.以多个线程同时对一个共享变量做加法运算为例,自增的汇编指令大致如下, ...

  6. c++11 多线程编程(六)------条件变量(Condition Variable)

    互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...

  7. C++11 condition_variable条件变量用法

    C++11 condition_variable条件变量用法 1 什么是条件变量 2 condition_variable类定义 2.1 wait函数 3 condition_variable用法 3 ...

  8. C++11下条件变量之虚假唤醒

    概述: 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 在线程开发的过程中 ...

  9. C++11多线程之条件变量

    原文: http://en.cppreference.com/w/cpp/thread/condition_variable std::condition_variable 定义在头文件<con ...

最新文章

  1. workerman的基本用法
  2. 中国电信的新媒体营销尝试
  3. PHP高并发的解决方案
  4. iOS 几种初始化的分析比较
  5. [20170513]update结果集.txt
  6. 《代码整洁之道》阅读笔记
  7. 数据中心电池室管理之经济实用性方法的探索
  8. session的存储方式和配置
  9. 神策数据钟秉哲:一文了解用户标签画像,从洞察到突破
  10. python从零开始的学习-python学习过程之从零开始
  11. 编程技巧:使用异或操作符(XOR)交换两数值
  12. wps html编辑表格,WPS 2017个人版演示word使用技巧(wps2017表格使用技巧)
  13. thinkphp5 接入百度语音合成接口,前台播报功能实例
  14. 蘑菇车联召开战略发布会 为用户提供无缝衔接的“人车生活”
  15. eclipse下的webservice开发
  16. MFC学习笔记(1)
  17. 程序员修炼之道(二)
  18. 用于机器学习的数据库--UCI数据库
  19. 计算机网络有哪三种地址,IP地址的分类有哪几种
  20. 加州大学洛杉玑分校计算机专业,加州大学洛杉矶分校计算机科学世界排名2019年最新排名第12(THE世界排名)...

热门文章

  1. 小学计算机教师用书,九年义务教育小学教科书-信息技术(第五册)(教师用书).pdf...
  2. 2015年8月之 英雄不老
  3. 完美世界手游服务器维护时间表,完美世界手游开服时间表 新区开服时间总览[多图]...
  4. 《网络安全应急响应技术实战指南》知识点总结(第9章 数据泄露网络安全应急响应)
  5. 索尼官网的产品怎么样?
  6. 第一章:Vue3.0+Openlayers+Cesium创建二三维联动项目
  7. Flink写RocketMQ支持动态UserProperty
  8. pixhawk(PX4)的一些论坛网站(包括中文版的PX4用户手册和PX4开发手册)
  9. java判断日期前后_Java丨时间判断谁前谁后
  10. Shortcuts使用解析(一)