<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p>接上篇:C++新特性35_条件变量的引入(传统采用while(1)的轮询方式解决线程按顺序执行和共享变量问题十分低效,使用条件变量可以实现高效的事件模型(类似于Qt中信号槽机制))引入了条件变量,用于线程间数据交互或者线程间存在先后顺序的情况,本篇将介绍如何使用条件变量。</p>
讯享网
条件变量在C++中有一个类,此处先不讲这个类,先讲在之后再讲C++11中是如何封装的 。
下为利用C++11中条件变量的代码:子线程先进入等待,主线程再发送信号
讯享网
其中对于中的第二个参数是前面讲到的互斥体的类型,普通、超时、递归等。

讯享网
整体代码的思维导图如下:

起一条子线程,可能在main之前或者之后调,操作系统采用动态的调用回调函数,有可能是在发送信号前也有可能是在发送信号之后。

- 如果在发送信号之前调用子线程,就执行进行等待,
- 如果在发送信号之后调用子线程,当时,接受信号进行打印
- 子线程回调是在发送信号前还是在发送信号之后都不会有影响。
条件变量g_cnd一定要搭配互斥体g_mtx使用根本原因是他们在保护一种条件while (!g_isSet),条件变量g_cnd总是搭配一种条件使用,所以将因此将称为条件变量;
条件变量g_cnd要被两个线程共享使用,所以需要依赖互斥体,因此条件while (!g_isSet)、 条件变量g_cnd、 互斥体g_mtx三胞胎需要同时使用。
- 条件变量:用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知。
- 条件变量自身并不包含条件。因为它通常和 if (或者while) 一起用,所以叫条件变量
- 需要配合互斥体mtx一起使用
- 使用:

- _Cnd_init/_Cnd_destroy
- _Cnd_wait :
- 进入函数前,必须首先获得mtx锁
- 进入该函数中,线程阻塞,发生:
<ul><li>线程陷入等待,直至条件变量信号被触发</li><li>互斥体mtx解锁</li></ul> </li><li>线程等待条件变量信号成功,函数即将返回,发生: <ul><li>在函数返回之前,mtx再次被上锁</li></ul> </li></ul> </li><li> <p>_Cnd_signal:</p>
- 解除当前在条件变量上等待的一个线程。 如果没有线程被阻塞,则不执行任何操作并返回。
- 解除当前等待条件变量的所有线程。 如果没有线程被阻塞,则不执行任何操作并返回。
3.学习视频地址: 条件变量的使用
请你说说条件变量?
得分点
线程同步、阻塞、唤醒

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/148322.html