C++11下条件变量之虚假唤醒
概述:
条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制。典型的场景包括生产者-消费者模型,线程池实现等。
对条件变量的使用包括两个动作:
在线程开发的过程中,肯定会遇到线程同步,我们会选择C++11中的condition_varible来方便我们处理。当在项目中看到前辈这样写
std::unique_lock<std::mutex> lock(m_mutex);
while(!m_isReady) //防止虚假唤醒
{
m_condition.wait(lock);
......
}
时,特别是注释 突然感觉自己有必要去了解一下这个名词,于是记录下自己的理解。
条件变量是依赖其他共享变量事项工作的,一般情况下搭配互斥锁变量mutex一起使用。
函数说明:
条件变量的wait/wait_for/wait_until:1.调用时使当前线程保持休眠状态,同时修改lock为解锁状态(这两部分操作是原子操作),wait_for/wait_until要求传入一个附加条件 在信号量长时间没有被唤醒时 停止等待。
2.在调用notify_one/notify_all后,条件变量被唤醒后,重新竞争互斥锁,并对互斥锁lock后才返回wait调用
虚假唤醒:
处于等待的添加变量可以通过notify_one/notify_all进行唤醒,调用函数进行信号的唤醒时,处于等待的条件变量会重新进行互斥锁的竞争。没有得到互斥锁的线程就会发生等待转移(wait morphing),从等待信号量的队列中转移到等待互斥锁的队列中,一旦获取到互斥锁的所有权就会接着向下执行,但是此时其他线程已经执行并重置了执行条件,这是该线程执行就可并引发未定义的错误。
结论:
所以我们在实际的代码中用while而不使用if,while可以有效的避免虚假唤醒引起的问题。其实,在条件变量中是可以实现杜绝虚假唤醒的,但是这样做会很大程度上影响条件变量的效率,因此将这个问题抛给了程序员。
另:
在进行条件变量的唤醒时我们通常有两种做法 1.互斥锁unlock。notify条件变量。2.notify条件变量,互斥锁unlock。这两种方式下。第一种情况等待的条件变量在被唤醒时可以立刻获取互斥锁的所有权进行代码执行。而在第二种情况下,被唤醒的条件变量,要重新放到互斥锁的竞争队列中,等待互斥锁unlock,这样就就行了两次的上下文的切换,影响执行效率
注:以上是个人理解,如有不正确的地方,欢迎指正
C++11下条件变量之虚假唤醒相关推荐
- 条件变量的虚假唤醒(spurious wakeups)问题
引言 条件变量是我们常用的同步原语之一,它的正确使用方式一般如下图: 在wait端,我们必须把判断布尔条件和wait()放到while循环中,而不能用if语句,原因是可能会引起虚假唤醒. 那么,究竟什 ...
- C++11 condition_variable条件变量用法
C++11 condition_variable条件变量用法 1 什么是条件变量 2 condition_variable类定义 2.1 wait函数 3 condition_variable用法 3 ...
- java 条件变量_Windows下条件变量的实现
条件变量是什么? 是一种同步对象. 条件变量有什么用? 用于复杂的.多线程的.多核的程序中,实现多个线程间同步任务. 条件变量与其它同步对象的区别? 与事件.互斥锁.segment等同步对象相比,条件 ...
- C++条件变量Wait及虚假唤醒
(1) wait(lock): 调用时即阻塞线程,并且调用lock.unlock() (2) wait(lock, conditions): 调用时检查conditions,如果为false,则阻塞线 ...
- linux条件变量唤醒丢失,多线程编程精髓(三)
本篇主要讲Linux环境下的多线程同步内核对象. (1)linux线程同步之互斥体:linux互斥体的用法与windows的临界区对象类似,使用数据结构 pthread_mutex_t表示互斥体对象( ...
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 对条件变量(condition variable)的讨论
作者:王东 1.1 什么是条件变量和条件等待? 简单的说: 条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个 ...
- 【C++】多线程与条件变量【三】
文章目录 1 条件变量是什么? 实例1: 2 条件变量本质? 3 引入条件变量的原因? 实例2: 实例3: 实例4: 4 如何使用条件变量? 4.1 std::condition_variable 实 ...
- 条件变量存在的陷阱、生产者与消费者模型
一.条件变量的使用 Linux下条件变量相关的API如下: pthread_cond_init:用于初始化条件变量. pthread_cond_destory:销毁条件变量. pthread_cond ...
最新文章
- 献给那些怀揣IT梦想的北漂一族
- 不再写死,SpringBoot实现动态增删启停定时任务
- 一文详解Inception家族的前世今生(从InceptionV1-V4、Xception)附全部代码实现
- 机器学习博士自曝:实验室「阉割」我的创造力,劝你别读
- 【bzoj4939】【YNOI2016】掉进兔子洞(莫队)
- # 2018-2019-1 20165230 《信息安全系统设计基础》第四周学习总结
- 解决 Cannot open D:\Program Files\Anaconda3\Scripts\pip-script.py 问题
- python可变类型和不可变深浅拷贝类型_python3笔记十四:python可变与不可变数据类型+深浅拷贝...
- Tomacat7启动报错 org.apache.catalina.deploy.WebXml addFilter
- c++11多线程学习笔记之一 thread基础使用
- oracle查询数据库的函数,Oracle:树查询及有关函数
- WBS——工作分解结构
- 使用Foxit Reader实现批量打印以及一页多版设置技巧
- 《麦肯锡卓越工作方法》读后感
- 用python获取某年日历表
- (转自MBA智库百科)弗兰克·吉尔布雷斯
- html caption 靠左,HTML caption align 属性 | Paoo教程
- 百度网盘下载提速小技巧
- 综合练习--The Eighth Week
- win10打开游戏提示你的图形硬件不支持怎么办