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

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()

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

相关文章:

  • CCS编译器无法导入工程文件,检查原因是版本编译器编译问题
  • 自适应布局,平均分配,自动换行,上下对齐
  • 大模型相关面试问题原理及举例
  • java+postgresql+swagger-多表关联insert操作(九)
  • 【Scratch编程入门】字母动画制作
  • NHANES指标推荐:CMI
  • LLaMA Factory多模态微调实践:微调Qwen2-VL构建文旅大模型
  • 《奇迹世界起源》:神之月晓活动介绍!
  • YRAN定义
  • Enovia许可证管理与监控工具
  • 对WAV文件进行降噪
  • 51、项⽬中的权限管理怎么实现的
  • k8s介绍与实践
  • 【AI提示词】儿童看护员
  • 【嵌入式】【阿里云服务器】【树莓派】学习守护进程编程、gdb调试原理和内网穿透信息
  • css图片设为灰色
  • Allure测试报告按测试终端和测试类型智能分类查看
  • 前端为什么需要单元测试?
  • 数据仓库分层架构解析:从理论到实战的完整指南​​
  • AXOP36061S: 60V 高压单通道运算放大器
  • 习近平致电祝贺阿尔巴尼斯当选连任澳大利亚总理
  • 巴称巴控克什米尔地区11人在印方夜间炮击中身亡
  • 国家统计局:4月份居民消费价格同比下降0.1%
  • 马云再次现身阿里打卡创业公寓“湖畔小屋”,鼓励员工坚持创业精神
  • 101条关于减重的知识,其中一定有你不知道的
  • “仓促、有限”,美英公布贸易协议框架,两国分别获得了什么?