C++(14): STL条件变量std::condition_variable
1. 简述
在C++的标准模板库(STL)中,std::condition_variable是一个非常重要的同步原语,用于在多线程编程中实现线程间的条件同步。它允许一个或多个线程等待某个条件成立,当条件成立时,等待的线程会被唤醒并继续执行。
2. 基本概念
std::condition_variable通常与std::mutex一起使用,用于保护共享数据并同步线程。在多线程环境中,多个线程可能同时访问和修改共享数据,这可能导致数据不一致或其他不可预测的行为。std::mutex用于确保在任何时候只有一个线程可以访问共享数据,而std::condition_variable则用于在特定条件下唤醒等待的线程。
3. 条件变量的工作原理
条件变量允许线程在某些条件不满足时挂起(等待),并在条件变为真时被唤醒。这通常涉及到以下三个步骤:
等待条件
线程在进入临界区后,检查条件是否满足。如果不满足,线程会释放互斥锁并进入等待状态。
通知其他线程
当条件可能已经变为真的事件发生时,另一个线程会通知等待的线程。
重新检查条件
被通知的线程重新获取互斥锁,并重新检查条件。如果条件仍然不满足,线程可能会再次等待。
4. 主要函数
std::condition_variable提供了几个主要的成员函数,用于实现线程间的条件同步:
wait(std::unique_lock<std::mutex>& lock)
使当前线程进入等待状态,直到另一个线程调用notify_one()或notify_all()。在等待期间,lock参数指定的互斥锁会被自动释放,允许其他线程访问共享数据。当线程被唤醒时,互斥锁会再次被锁定。
wait_for(std::unique_lock<std::mutex>& lock, std::chrono::duration<Rep, Period> rel_time)
与wait()类似,但允许指定一个超时时间。如果超时时间到达而条件仍未成立,线程将停止等待并继续执行。
wait_until(std::unique_lock<std::mutex>& lock, std::chrono::time_point<Clock, Duration> abs_time)
与wait_for()类似,但允许指定一个绝对时间作为超时时间。
notify_one()
唤醒等待在condition_variable上的一个线程(如果有的话)。
notify_all()
唤醒等待在condition_variable上的所有线程。
std::condition_variable 的 wait、notify_one 和 notify_all 函数都要求在调用时拥有互斥锁的所有权。std::unique_lock 通过提供对互斥锁的独占控制,确保了这些条件变量函数能够安全地与锁的获取和释放配合工作。
使用 std::unique_lock 包装 std::mutex 是为了确保线程安全、简化资源管理、防止死锁,并与条件变量正确配合。
5. 例程
在这个程序里,我们的条件就是ready变量变为true,然后再执行其他操作。
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void print_id(int id) { std::unique_lock<std::mutex> lck(mtx); /** 如果条件不满足,则等待. */while (!ready) {cv.wait(lck); ///< 等待、阻塞}/** 执行其他操作. */} void Signal() { std::unique_lock<std::mutex> lck(mtx); ready = true; ///< 设置条件为true cv.notify_all(); ///< 唤醒所有等待的线程 } int main(int argc, char* argv[]){std::thread threads[10]; /** 发起10个线程. */ for (int i = 0; i < 10; ++i) threads[i] = std::thread(print_id, i); std::cout << "10 threads ready to race...\n"; Signal(); ///< 唤醒线程,继续执行.for (auto& th : threads){th.join();}return 0; }
相关文章:
C++(14): STL条件变量std::condition_variable
1. 简述 在C的标准模板库(STL)中,std::condition_variable是一个非常重要的同步原语,用于在多线程编程中实现线程间的条件同步。它允许一个或多个线程等待某个条件成立,当条件成立时,等待的线程会被唤醒并继…...
Harmony与Android项目结构对比
主要文件对应 Android文件HarmonyOS文件清单文件AndroidManifest.xmlmodule.json5Activity/Fragmententryability下的ts文件XML布局pages下的ets文件resresourcesModule下的build.gradleModule下的build-profile.json5gradlehvigor根目录下的build.gradle根目录下的build-profi…...
langchain 学习笔记-FunctionCalling三种方式
ChatGPT 基于海量的训练数据生成答案,所以它无法回答训练数据中没有的信息或搜索信息 。人们希望 ChatGPT 具有对话以外的各种功能,例如“我想管理我的待办事项列表”。 函数调用是对此类请求的响应。 通过使用函数调用,ChatGPT 现在可以在生…...
CNAS软件测试公司有什么好处?如何选择靠谱的软件测试公司?
CNAS认可是中国合格评定国家认可委员会的英文缩写,由国家认证认可监督管理委员会批准设立并授权的国家认可机构,统一负责对认证机构、实验室和检验机构等相关机构的认可工作。 在软件测试行业,CNAS认可具有重要意义。它标志着一个软件测试公…...
Cohere推出全新升级版RAG大型AI模型:支持中文,搭载1040亿参数,现开源其权重!
4月5日,知名类ChatGPT平台Cohere在其官方网站上发布了一款全新的模型——Command R。 据官方消息,Command R拥有1040亿个参数,并且支持包括英语、中文、法语、德语在内的10种语言。这一模型的显著特点之一在于其对内置的RAG(检索增…...
搭建前后端的链接(java)
搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE,也就是java企业版,也就是java后端(后端javaSE) 利用javaEE和前端交互,javaSE和数据库交互,javaSE和javaEE之间再进行交互就实现了前后端的交互…...
Java多路查找树(含面试大厂题和源码)
多路查找树(Multiway Search Tree),也称为B树或B树,是一种自平衡的树形数据结构,用于存储大量数据,通常用于数据库和文件系统中。它允许在查找、插入和删除操作中保持数据的有序性,同时优化了磁…...
day6 | 哈希表 part-2 | 454 四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
今日任务 454 四数相加II (题目: . - 力扣(LeetCode))383 赎金信 (题目: . - 力扣(LeetCode)) 454 四数相加II 题目:. - 力扣(LeetCode) 给你四个整数数组 nums1、num…...
Redis常见数据类型(2)
目录 String字符串 常见命令 SET GET MGET MSET SETNX 计数命令 INCR INCRBY DECR DECRBY INCRFLOAT 其它命令 APPEND GETRANGE SETRANGE STRLEN String字符串 字符串是Redis最基础的数据类型, 关于字符串需要特别注意: (1)首先Redis中所有的键的类型都是字符…...
SparkBug解决:Type mismatch; found : org.apache.spark.sql.Column required: Double
def assginFlag(aizmuth:Double):Option[Int] {val interval 0.5val index (aizmuth / interval ).toIntif (index > 0 && index < 720 ) Some(index 1) else None} assginFlag方法中的条件判断条件 (index > 0 && index < 720) 返回的是一个布…...
MQ之————如何保证消息的可靠性
MQ之保证消息的可靠性 1.消费端消息可靠性保证: 1.1 消息确认(Acknowledgements): 消费者在接收到消息后,默认情况下RabbitMQ会自动确认消息(autoAcktrue)。为保证消息可靠性,可以…...
TrollInstallerX官方一键安装巨魔商店
TrollInstallerX是巨魔官方开发的一款一键巨魔商店安装器,完美支持iOS 14.0 – 16.6.1的设备,操作非常简单,TrollInstallerX依然有个小小的限制,部分机型,还是要采用间接安装方法。 一,直接安装方法 通过…...
生成随机图片验证码
随着互联网的不断发展,安全性问题日益突出。为了保障用户账号的安全性,很多网站都引入了验证码机制。验证码是一种区分用户是计算机还是人的公共全自动程序,可以有效防止恶意攻击和自动化脚本的滥用。本文将介绍如何使用Python生成随机图片验…...
【0280】《数据库系统概论》阅读总结(附xmind思维导图)
0. 阅读进展 选择性地读取了《数据库系统概论》一书中的第13、14章节,并对这两章节中较为重点的内容作了总结和归纳;然后以xmind导图形式给出。 1. xmind思维导图 Xmind附件:...
数据结构(二)----线性表(顺序表,链表)
目录 1.线性表的概念 2.线性表的基本操作 3.存储线性表的方式 (1)顺序表 •顺序表的概念 •顺序表的实现 静态分配: 动态分配: 顺序表的插入: 顺序表的删除: 顺序表的按位查找: 顺序…...
为什么你选择成为一名程序员?
文章目录 ✍选择成为程序员:兴趣与职业发展的交汇💎1 兴趣的驱动💎2 职业发展的需求💎3 结语 ✍选择成为程序员:兴趣与职业发展的交汇 在当今数字化时代,程序员已经成为一个备受瞩目的职业。无论是因为对技…...
【Android】系统启动流程分析 —— SystemServer 处理过程
本文基于 Android 14.0.0_r2 的系统启动流程分析。 SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。 一、源码解析 Zyg…...
Web前端—属性描述符
属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象,我们如何来描述属性a: 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…...
SpringBoot及其特性
0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot?使用 Spring 框架,我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架,我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…...
「JavaEE」初识进程
初识进程 🍉进程🍌操作系统的进程管理 🍉PCB 重要属性🍌进程的身份标识🍌内存指针🍌文件描述符表🍌进程的状态🍌优先级🍌记账信息🍌上下文 🍉内存…...
J-Link V8变砖别慌!手把手教你用SAM-BA 2.14救活AT91SAM7S64芯片
J-Link V8救砖实战:用SAM-BA 2.14拯救AT91SAM7S64芯片全指南 当你的J-Link V8调试器突然"变砖"——LED灯熄灭、电脑无法识别、所有功能瘫痪时,那种感觉就像外科医生在手术台上突然失去所有仪器。但别急着宣布它的"死亡",…...
iOS 18.2 Siri大模型升级:从命令响应到意图理解的混合智能架构解析
1. 项目概述:当Siri遇上ChatGPT,一次迟来的“大脑移植”作为一名长期关注移动操作系统与AI交互的从业者,我几乎第一时间就刷到了iOS 18.2 Beta 1的更新包。这次更新的标题——“Siri接入ChatGPT技术”——简单直接,却足以在圈内掀…...
终极免费音频编辑解决方案:告别昂贵软件,用Audacity实现专业级音频处理
终极免费音频编辑解决方案:告别昂贵软件,用Audacity实现专业级音频处理 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 还在为音频编辑软件的高昂费用而烦恼?是否曾因复杂的专业…...
MA730/MT6835/MT6825/MT6709磁编码器SPI通信实战:从寄存器配置到角度解析
1. 磁编码器SPI通信基础与选型指南 磁编码器作为现代电机控制和机器人系统中的核心传感器,其精度和响应速度直接影响整个系统的性能。MA730、MT6835、MT6825和MT6709这几款磁编码器在工业界应用广泛,它们都采用SPI接口进行通信,但在具体实现上…...
3大核心功能深度解析:如何用FanControl打造个性化静音散热系统
3大核心功能深度解析:如何用FanControl打造个性化静音散热系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tre…...
【ElevenLabs葡语语音实战指南】:20年AI语音工程师亲测的5大本地化避坑清单(附实测TTS自然度评分92.7%)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs葡语语音的核心技术架构与本地化本质 ElevenLabs 的葡语语音合成并非简单地在英语模型上叠加音素映射,而是基于多语言联合训练框架构建的端到端神经语音系统,其核心依…...
别再死记硬背了!用面包板和Arduino Nano,5分钟搞懂MOS管开关控制LED
用面包板和Arduino Nano轻松掌握MOS管控制LED的奥秘 记得第一次接触MOS管时,我被那些复杂的参数曲线和公式搞得晕头转向。直到有一天,导师扔给我一块面包板、几个元器件说:"别盯着书本看了,动手试试看!"那天…...
如何在Windows 11上完美运行经典游戏:DDrawCompat终极兼容性解决方案
如何在Windows 11上完美运行经典游戏:DDrawCompat终极兼容性解决方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mir…...
使用 Taotoken CLI 工具一键配置多开发环境与团队协作密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken CLI 工具一键配置多开发环境与团队协作密钥 在团队协作开发中,统一大模型 API 的接入配置是一项基础但繁…...
装机解惑:Bios中的Secure Boot与CSM,为何相爱相杀?
1. Secure Boot与CSM:现代PC的引导之争 刚装好的新电脑突然黑屏,这种经历估计不少DIY玩家都遇到过。上周我就帮朋友处理了这么个案例:他为了省钱继续用老显卡GTX650ti,结果在新配的13代酷睿主机上死活点不亮屏幕。这背后其实是UEF…...
