C++11条件变量:notify_one()与notify_all()的区别
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()的区别相关推荐
- C++11 条件变量
目录 条件变量 1 成员函数 wait函数 wait_for函数 wait_until函数 notify_one函数 notify_all函数 2 Demo1 sync_queue.h conditi ...
- C++11条件变量使用详解
condition_variable介绍 在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作:当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这 ...
- C++条件变量使用详解
1. condition_variable介绍 在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作:当条件不满足时,相关线程被一直阻塞,直到某种条件出 ...
- linux C语言多线程库pthread中条件变量的正确用法逐步详解
linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...
- C++11学习笔记-----互斥量以及条件变量的使用
在多线程环境中,当多个线程同时访问共享资源时,由于操作系统CPU调度的缘故,经常会出现一个线程执行到一半突然切换到另一个线程的情况.以多个线程同时对一个共享变量做加法运算为例,自增的汇编指令大致如下, ...
- c++11 多线程编程(六)------条件变量(Condition Variable)
互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...
- C++11 condition_variable条件变量用法
C++11 condition_variable条件变量用法 1 什么是条件变量 2 condition_variable类定义 2.1 wait函数 3 condition_variable用法 3 ...
- C++11下条件变量之虚假唤醒
概述: 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 在线程开发的过程中 ...
- C++11多线程之条件变量
原文: http://en.cppreference.com/w/cpp/thread/condition_variable std::condition_variable 定义在头文件<con ...
最新文章
- workerman的基本用法
- 中国电信的新媒体营销尝试
- PHP高并发的解决方案
- iOS 几种初始化的分析比较
- [20170513]update结果集.txt
- 《代码整洁之道》阅读笔记
- 数据中心电池室管理之经济实用性方法的探索
- session的存储方式和配置
- 神策数据钟秉哲:一文了解用户标签画像,从洞察到突破
- python从零开始的学习-python学习过程之从零开始
- 编程技巧:使用异或操作符(XOR)交换两数值
- wps html编辑表格,WPS 2017个人版演示word使用技巧(wps2017表格使用技巧)
- thinkphp5 接入百度语音合成接口,前台播报功能实例
- 蘑菇车联召开战略发布会 为用户提供无缝衔接的“人车生活”
- eclipse下的webservice开发
- MFC学习笔记(1)
- 程序员修炼之道(二)
- 用于机器学习的数据库--UCI数据库
- 计算机网络有哪三种地址,IP地址的分类有哪几种
- 加州大学洛杉玑分校计算机专业,加州大学洛杉矶分校计算机科学世界排名2019年最新排名第12(THE世界排名)...
热门文章
- 小学计算机教师用书,九年义务教育小学教科书-信息技术(第五册)(教师用书).pdf...
- 2015年8月之 英雄不老
- 完美世界手游服务器维护时间表,完美世界手游开服时间表 新区开服时间总览[多图]...
- 《网络安全应急响应技术实战指南》知识点总结(第9章 数据泄露网络安全应急响应)
- 索尼官网的产品怎么样?
- 第一章:Vue3.0+Openlayers+Cesium创建二三维联动项目
- Flink写RocketMQ支持动态UserProperty
- pixhawk(PX4)的一些论坛网站(包括中文版的PX4用户手册和PX4开发手册)
- java判断日期前后_Java丨时间判断谁前谁后
- Shortcuts使用解析(一)