c++ 条件变量signal(c++ 条件变量 future)

c++ 条件变量signal(c++ 条件变量 future)接上篇 C 新特性 35 条件变量的引入 传统采用 while 1 的轮询方式解决线程按顺序执行和共享变量问题十分低效 使用条件变量可以实现高效的事件模型 类似于 Qt 中信号槽机制 引入了条件变量 用于线程间数据交互或者线程间存在先后顺序的情况 本篇将介绍如何使用条件变量 条件变量在 C 中有一个类



接上篇:C++新特性35_条件变量的引入(传统采用while(1)的轮询方式解决线程按顺序执行和共享变量问题十分低效,使用条件变量可以实现高效的事件模型(类似于Qt中信号槽机制))引入了条件变量,用于线程间数据交互或者线程间存在先后顺序的情况,本篇将介绍如何使用条件变量。

条件变量在C++中有一个类,此处先不讲这个类,先讲在之后再讲C++11中是如何封装的 。

下为利用C++11中条件变量的代码:子线程先进入等待,主线程再发送信号

 

其中对于中的第二个参数是前面讲到的互斥体的类型,普通、超时、递归等。
在这里插入图片描述
整体代码的思维导图如下:
在这里插入图片描述

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

  • 如果在发送信号之前调用子线程,就执行进行等待,
  • 如果在发送信号之后调用子线程,当时,接受信号进行打印
  • 子线程回调是在发送信号前还是在发送信号之后都不会有影响。

条件变量g_cnd一定要搭配互斥体g_mtx使用根本原因是他们在保护一种条件while (!g_isSet),条件变量g_cnd总是搭配一种条件使用,所以将因此将称为条件变量;

条件变量g_cnd要被两个线程共享使用,所以需要依赖互斥体,因此条件while (!g_isSet)、 条件变量g_cnd、 互斥体g_mtx三胞胎需要同时使用。

  1. 条件变量:用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知。

  2. 条件变量自身并不包含条件。因为它通常和 if (或者while) 一起用,所以叫条件变量

  3. 需要配合互斥体mtx一起使用

  4. 使用:

  • _Cnd_init/_Cnd_destroy

  • _Cnd_wait :

    • 进入函数前,必须首先获得mtx锁
    • 进入该函数中,线程阻塞,发生:
      • 线程陷入等待,直至条件变量信号被触发
      • 互斥体mtx解锁
    • 线程等待条件变量信号成功,函数即将返回,发生:
      • 在函数返回之前,mtx再次被上锁
  • _Cnd_signal:

    • 解除当前在条件变量上等待的一个线程。 如果没有线程被阻塞,则不执行任何操作并返回。
  • _Cnd_broadcast:

    • 解除当前等待条件变量的所有线程。 如果没有线程被阻塞,则不执行任何操作并返回。

3.学习视频地址: 条件变量的使用

请你说说条件变量?
得分点
线程同步、阻塞、唤醒

标准回答
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止。条件变量始终与互斥锁一起使用,对条件的测试是在互斥锁(互斥)的保护下进行的。如果条件为假,线程通常会基于条件变量阻塞,并以原子方式释放等待条件变化的互斥锁。如果另一个线程更改了条件,该线程可能会向相关的条件变量发出信号,从而使一个或多个等待的线程执行以下操作: 唤醒 再次获取互斥锁 重新评估条件

编程小号
上一篇 2025-01-25 16:06
下一篇 2025-02-16 20:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/64308.html