当前位置: 首页 > news >正文

关于 std::condition_variable

一. std::condition_variable是什么?

std::condition_variable 是 C++ 标准库提供的一个线程同步的工具用于实现线程间的条件变量等待和通知机制。  条件变量的发生通常与某个共享变量的状态改变相关。  在多线程编程中,条件变量通常和互斥锁(std::mutex)一起使用,以避免死锁等问题。

二.用法

其常见用法如下:

1.定义std::condition_variable对象

std::condition_variable cv;

2.定义一个互斥锁对象

std::mutex m;

3.定义一个bool类型变量作为条件,通常与互斥锁一起使用

bool condition = false;

4.等待条件变量的通知

std::unique_lock<std::mutex> lk(m);
while (!condition) {cv.wait(lk); // 释放锁并等待通知
}
// 唤醒后继续执行

在等待时,std::condition_variable::wait()函数会自动释放互斥锁并将线程挂起,等待其他线程通过std::condition_variable::notify_one()std::condition_variable::notify_all()函数发出通知后唤醒线程。

唤醒后,std::unique_lock会重新锁定互斥锁,线程继续执行。

5.发送条件变量的通知

std::unique_lock<std::mutex> lk(m);
condition = true;
cv.notify_one(); // 发送通知

在发送通知时,必须先获取互斥锁,并修改条件变量的状态后才能发送通知。

需要注意的是: 

std::condition_variable一般需要和std::unique_lock一起使用,以避免竞态条件的出现。      

此外,线程在等待条件变量时,可能会出现虚假唤醒的情况,因此应该使用while循环检查条件变量的状态,而不是if语句。

三.示例

std::condition_variable的用法通常是与 std::unique_lock , std::mutex 一起使用。

可以通过以下步骤来使用 std::condition_variable :

  1. 创建std::mutex对象来保护共享资源。
  2. 创建std::condition_variable对象。
  3. 在需要等待共享资源的线程中,使用std::unique_lock, std::mutex 锁住共享资源,并使用std::condition_variable的wait()函数来阻塞线程等待通知。
  4. 在修改共享资源的线程中,修改共享资源,并使用std::condition_variable的notify_one()或notify_all()函数来通知等待的线程。
  5. 等待的线程被唤醒后,使用std::unique_lock, std::mutex 锁住共享资源,并检查共享资源是否已经被修改。

下面是一个使用std::condition_variable的示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex m;
std::condition_variable cv;
bool ready = false;void worker_thread() {// 等待主线程的信号std::unique_lock<std::mutex> lock(m);while(!ready) {cv.wait(lock);}// 做一些工作std::cout << "Worker thread is working" << std::endl;
}int main() {// 创建工作线程std::thread worker(worker_thread);// 做一些工作std::cout << "Main thread is doing something" << std::endl;// 发送信号给工作线程{std::lock_guard<std::mutex> lock(m);ready = true;}cv.notify_one();// 等待工作线程完成worker.join();return 0;
}

运行后:

 

在这个例子中,主线程和工作线程共享了一个bool型变量ready,用来表示工作线程是否可以开始工作。主线程先打印一条消息,然后发送信号给工作线程。工作线程在启动后使用std::unique_lock, std::mutex 锁住共享资源ready,并在while循环中等待信号。一旦收到信号,工作线程就会解锁并开始工作。主线程等待工作线程完成后退出。

相关文章:

关于 std::condition_variable

一. std::condition_variable是什么&#xff1f; std::condition_variable 是 C 标准库提供的一个线程同步的工具&#xff0c;用于实现线程间的条件变量等待和通知机制。 条件变量的发生通常与某个共享变量的状态改变相关。 在多线程编程中&#xff0c;条件变量通常和互斥锁…...

可拓展哈希

可拓展哈希 借CMU 15445的ppt截图来说明问题。 我们传统静态hash的过程是hash函数后直接将值存入对应的bucket&#xff0c;但是在可扩展hash中&#xff0c;得查询Directory&#xff08;左&#xff09;&#xff0c;存入directory指向的bucket&#xff08;右&#xff09;。 下面…...

Java 版 spring cloud 工程系统管理 +二次开发 工程项目管理系统源码

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

通过伴随矩阵怎么求逆矩阵

设矩阵A为n阶方阵&#xff0c;其伴随矩阵为Adj(A)&#xff0c;则A的逆矩阵为&#xff1a; A⁻ (1/|A|) Adj(A) |A|为A的行列式 Adj(A)为A的伴随矩阵 具体步骤如下&#xff1a; 求出A的行列式|A| 求出A的伴随矩阵 Adj(A) 。伴随矩阵的定义为&#xff1a;对于A的第i行第j列…...

巡检机器人之仪表识别系统

作者主页&#xff1a;爱笑的男孩。 博客简介&#xff1a;分享机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。 如发现文章有误&#xff0c;麻烦请指出&#xff0c;我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666foxmail.c…...

面试官反感的求职者(下)

上期给大家总结了面试中常见的一些问题&#xff0c;今天就接着上次的话题再给大家说说HR反感的求职者&#xff0c;希望同学们可以自省&#xff0c;避免踩雷。小编从如信银行考试中心了解到的有&#xff1a; 第一、缺乏个性者 这种考生在答题中往往表现得千篇一律&#xff0c;从…...

可视化绘图技巧100篇分析篇(二)-生存曲线(LM曲线)(补充篇)

目录 前言 知识储备 生存分析中的基本概念 生存分析 (survival analysis) 事件 (event)...

【100%通过率 】【华为OD机试python】钟表重合时刻【 2023 Q1考试题 A卷|100分】

华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! ■ 题目描述 钟表是日常生活中不可缺少的时间度量计, 其时针、分针、秒针三者的转动速度满足特定规律(见备注)。 现在输入时刻 time ,请计算出时刻 time 小时和 time+1 小时之间, 时针和分针…...

Java线程池编码示例

第1步&#xff1a;自定义线程实现类 Java中多线程编码时&#xff0c;定义线程类有两种方式&#xff1a; 继承Thread类实现Runnable接口&#xff08;由于Java的单继承特性&#xff0c;一般推荐使用此方式&#xff09; public class BizThread implements Runnable {private int …...

如何优化Android 4.x系统设置字体大小

android4.x系统设置字体大小导致应用布局混乱的解决方案 在前几年&#xff0c;Android系统的设置界面还是相对简单的&#xff0c;用户可以通过设置菜单进行各种系统设置&#xff0c;如字体大小、壁纸、铃声等。但是随着用户对系统功能的需求越来越多&#xff0c;Android系统也在…...

Docker安装、Docker基本操作

一、Dokcer安装 1.安装 # 1、yum 包更新到最新,需要几分钟时间(注意:也可以直接跨过) sudo yum update # 2、作用&#xff1a;安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 sudo yum install -y yum-util…...

系统集成项目管理工程师知识点总结

项目经理的五种权利&#xff1a; 职位权力&#xff1a; 来源于管理者在组织中的职位和职权。罚权力&#xff1a; 使用降职、扣薪、惩罚、批评、威胁等负面手段的能力。奖励权力&#xff1a; 给予下属奖励的能力专家权力&#xff1a; 来源于个人的专业技能。参照&#xff08;号…...

【游戏里的网络同步分析】马里奥制造2 多人模式

前置知识 先说几个游戏设计的术语。 PlayerAgent是玩家控制的网络游戏中的角色形象&#xff0c;也是代表在游戏空间中的玩家&#xff0c;被唯一PlayerController所拥有&#xff0c;被所有用户可观测到。 在马里奥制造2中&#xff0c;PlayerAgent一共有四种&#xff1a;马里奥 …...

SSM框架学习-注解开发第三方bean管理

1. 复习xml配置文件管理第三方bean 在Spring中&#xff0c;可以使用依赖注入&#xff08;Dependency Injection&#xff09;来管理和使用第三方Bean。Spring提供了多种方式来进行依赖注入&#xff0c;比如构造函数注入、Setter方法注入、字段注入等。下面以Setter方法注入为例&…...

【数据结构与算法】图——邻接表与邻接矩阵

文章目录 一、图的基本概念二、图的存储结构2.1 邻接矩阵2.2 邻接表2.3 邻接矩阵的实现2.4 邻接表的实现 三、总结 一、图的基本概念 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G&#xff08;V,E&#…...

网安笔记02 密码学基础

密码学概述 • 1.1、密码学的基本概念 密码编码学 : 密码编制 密码分析学 : 密码破译 密码学 &#xff1a; 研究密码保护 通信手段的科学&#xff0c; 密码编码学密码分析学 密码技术&#xff1a; 把可理解的消息伪装为不可理解的消息&#xff0c;再复原成原消息的科学 概…...

open3d io操作

目录 1. read_image, write_image 2. read_point_cloud, write_point_cloud 3. 深度相机IO操作 4. Mesh文件读取 1. read_image, write_image 读取jpg. png. bmp等文件 image_io.py import open3d as o3dif __name__ "__main__":img_data o3d.data.JuneauIma…...

【Linux】Linux安装Redis(图文解说详细版)

文章目录 前言第一步&#xff0c;下载安装包第二步&#xff0c;上传安装包到/opt下&#xff08;老规矩了&#xff0c;安装包在opt下&#xff09;第三步&#xff0c;解压安装包第四步&#xff0c;编译第五步&#xff0c;安装第六步&#xff0c;配置redis第七步&#xff0c;设置开…...

setTimeout不准时,CSS精准实现计时器功能

实际开发过程中&#xff0c;我们会经常遇到&#xff0c;首次进入页面进行相应提示&#xff0c;然后指定时间后自动消失或者前端时钟展示等需求。 按照传统方案&#xff0c;我们可以使用 setTimeout 实现。但其存在&#xff1a;实际延时比设定值更久的情况。 setTimeout 不准时…...

单细胞跨模态分析综述

单细胞技术的最新进展使跨模态和组织位置的细胞高通量分子分析成为可能。单细胞转录组数据现在可以通过染色质可及性、表面蛋白表达、适应性免疫受体库分析和空间信息进行补充。跨模态单细胞数据的可用性越来越高&#xff0c;推动出新的计算方法&#xff0c;以帮助科学家获得生…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...