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

C++11中的std::condition_variable

一、什么是条件变量?

std::condition_variable 是C++11标准库中提供的线程同步工具,用于在多线程环境中实现“等待-通知”机制。它的核心作用是让线程能够高效地等待某个条件成立,避免“忙等待”对CPU资源的浪费。

条件变量必须与std::mutex配合使用。当一个线程需要等待某个条件时,它会释放互斥锁并进入阻塞状态;当其他线程修改了条件并发出通知时,等待的线程会被唤醒并重新获取锁,继续执行后续操作。

二、 关键成员函数

wait()

线程阻塞,直到被通知且条件满足。通常与std::unique_lockstd::mutex一起使用。

wait () 函数有两种形式,一种是只传递锁,另一种是传递锁和一个谓词(即返回布尔值的函数或lambda)。带谓词的wait()实际上会在被唤醒时自动检查谓词条件,如果条件不满足,线程会继续等待。这样可以避免因为虚假唤醒而错误地继续执行。

1️⃣ 无谓词版本:wait(lock)
线程被唤醒后直接继续执行,不会自动检查条件是否满足。

// 错误示例:不防御虚假唤醒
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock); // 仅等待通知,不检查条件
// 此处可能条件尚未满足!

2️⃣ 带谓词版本:wait(lock, predicate)
线程被唤醒后自动检查谓词,只有条件满足时才会退出等待。

// 正确示例:防御虚假唤醒
cv.wait(lock, [&]{ return buffer.size() < MAX_SIZE; });

因为线程调度不确定性:多核CPU或复杂调度策略可能导致意外唤醒。 若不处理虚假唤醒,线程可能误判条件已满足,导致数据竞争或逻辑错误。

notify_one()

唤醒一个等待此条件变量的线程(无特定顺序)。

notify_all()

唤醒所有等待此条件变量的线程。

wait_for() / wait_until()

支持超时机制,避免无限等待。

http://www.xdnf.cn/news/234.html

相关文章:

  • 深度学习中的概念——元素积(哈达玛积)
  • Skipped breakpoint at ... because of stepping in another thread问题分析
  • 制造企业PLM深度应用:2025年基于PDCA循环的7项持续改进指标
  • 2025年Q2(桥式)起重机司机题库考试精选题
  • 高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
  • AI的出现,是否能替代IT从业者?
  • 电子电器架构 --- OEM企标中规定ECU启动时间的目的
  • 第七篇:系统分析师第三遍——1、2章
  • 【Spring Boot】把jar包导入本地系统
  • C#获取当前方法的命名空间、类名称、方法名称以及方法的参数信息
  • 【前端HTML生成条形码——MQ】
  • DeepSeek深度观察:白宫“炒人“威胁的语义强度与市场应激量化分析
  • 【Unity】使用Cinemachine+CharacterController实现第三人称视角下的角色视角、移动和跳跃控制
  • Maven与Springboot创建
  • Qt QThread 两种线程管理方法
  • 通信算法之269 : OFDM信号的循环自相关特性用于无人机图传信号识别
  • Ethernet/IP转ProfiNet边缘计算网关在能源管理中的应用:跨系统数据聚合与智能分析
  • (7)VTK C++开发示例 --- 使用交互器
  • 英伟达A100、H100、H800性能详细对比
  • 4.18日学习--引用
  • 记一次bat脚本的坑:中文注释导致脚本不能运行
  • 【无标题】作业
  • 不确定与非单调推理的基本概念
  • 新书速览|DeepSeek移动端AI应用开发:基于Android与iOS
  • win11系统截图的几种方式
  • SQL通用语法和注释,SQL语句分类(DDL,DML,DQL,DCL)及案例
  • 深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失
  • Spring Boot自动配置原理深度解析:从条件注解到spring.factories
  • FFmpeg 硬核指南:从底层架构到播放器全链路开发实战 基础
  • Animated Raindrop Ripples In HLSL