博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解C++多线程(三)
阅读量:6319 次
发布时间:2019-06-22

本文共 1483 字,大约阅读时间需要 4 分钟。

条件变量

这一章主要讲讲条件变量condition_variable。条件变量是一个非常神奇的存在,是线程间交互的一种方式。

C++11提供了condition_variable类。使用时需要include头文件<condition_variable>。

如果把变量区看成是一座房子,那么前面两章频繁用到的mutex可以看成是房门的锁,正常来说是房门常年打开的,锁并用不上。但是有了多线程以后,为了防止多个线程一窝蜂胡乱篡改里面的数据,所以就有了锁的概念。

现在假设每个线程都有一个管理锁的人,叫lock_guard,或者unique_lock,但是一次只能有一个人能够去操作锁(锁上或者是解锁)。一般来说他们是轮流去操作锁。而condition_variable则可以看做是门童,如果没有满足条件,门童就会通知线程的管锁人必须要休眠而不可以操作锁,可是一旦条件满足,他就会唤醒某些线程的管锁人可以去操作锁了。

#include
#include
#include
#include
#include
using namespace std;bool ready = false;bool processed = false;mutex mu;condition_variable cv;string data;void worker_thread(){ unique_lock
locker(mu); //ready = false,此处相当于全局变量区的门童通知t线程休眠 cv.wait(locker, [](){ return ready;}); //ready = true,休眠结束。此时locker上锁,开始修改变量 cout<<"start processing data"<
locker(mu); //locker开始上锁,main线程修改全局变量 ready = true; cout<<"main signals data ready for processing"<

 

上面的代码中需要注意一下几点:

 

1. 代码中的 [](){return ready;}是匿名函数,也可以用循环的写法。

//cv.wait(locker, [](){return ready;});     //或者写成while(ready==false)    cv.wait(locker);

注意是while(ready == false),不是if(ready == false),因为wait的唤醒可能由于系统的原因被唤醒,这个的时机是不确定的。这个过程也被称作伪唤醒(spurious wakeup)。

如果在错误的时候被唤醒,就开始执行了后面的操作就会造成错误。

2. 注意cv.wait() 和cv.notify_all()或者cv.notify_one()需要搭配使用才能真正发挥条件变量的作用。

3. cv.notify_one()指的是通知其中某一个线程,cv.notify_all()指的是通知全部线程。

 

 

 

 

 

参考:

  https://www.jianshu.com/p/c1dfa1d40f53

 

转载于:https://www.cnblogs.com/corineru/p/10850647.html

你可能感兴趣的文章
JAVA nio 2 定义 Path 类
查看>>
ubuntu12.04 安装配置jdk1.7
查看>>
修改tomcat服务器默认端口号
查看>>
bootstrap-datetimepicker 进一步跟进~~~开始时间和结束时间的样式显示
查看>>
idea创建maven-archetype-webapp项目无java目录
查看>>
《 Oracle查询优化改写 技巧与案例 》电子工业出版社
查看>>
关系型数据库种类
查看>>
ajax回调函数中使用$(this)取不到对象的解决方法
查看>>
java实现折半排序算法
查看>>
1024程序员节,向改变世界的程序员致敬
查看>>
还在呼吸致命空气?专业的斐讯空气检测仪,让你生活更健康!
查看>>
每月亿行代码、全球数万研发,落地DevOps的协同平台DevCloud
查看>>
一朝创业,十年奋战,和信VENGD 4.0让终端不再是难题!
查看>>
蚂蚁金服董事长说以后出国只要三句话:你好,谢谢,支付宝
查看>>
GO语言用户调查:更多程序员选择在工作中使用该语言!
查看>>
Apache RocketMQ 顶级项目之路
查看>>
江苏沭阳持续推进“厕所革命” 乡村换新颜
查看>>
湖北襄阳:公交车全部加装驾驶区安防隔离门
查看>>
报告:上市公司环境信息披露总体水平略有上升
查看>>
新疆库尔勒越冬水禽种类逐年增加已达10种
查看>>