c++条件变量的使用

cpp 复制代码
std::mutex _mutex;
std::condition_variable _cond;
bool _isFinish; //命令執行完成

void wait()
{
	std::unique_lock<std::mutex> lock(_mutex);
	_cond.wait(lock, [this] { return _isFinish; });
}

void notify()
{
	std::unique_lock<std::mutex> lock(_mutex);
	_isFinish = true;
	_cond.notify_one();
}

std::condition_variable条件变量是无状态的,需要通过lambda 表达式函数先检测状态**。**

调用wait函数的具体步骤:

第1步:先检查 lambda(这是关键!)

  • 线程已持有 mutex_

  • 立即执行 lambda 表达式判断条件

  • 如果 lambda 返回 true :条件已满足,wait 函数立即返回,线程继续执行(且保持持有锁)

  • 如果 lambda 返回 false:条件不满足,进入第2步

第2步:进入等待状态

  • 原子性地:释放锁 + 线程阻塞

  • 等待 notify_one()notify_all()

第3步:被唤醒后

  • 重新获取锁

  • 再次检查 lambda(循环检查)

  • 如果 true 则返回,如果 false 则继续等待

相关推荐
zh路西法几秒前
【Navigation2进阶】(十二):自主探索性能优化与 RIG 算法推导与 Nav2 插件实现
c++·dijkstra·ros2·rrt·navigation2·前沿探索
星恒随风8 分钟前
C++ STL 详解:set 与 multiset 的使用、区间查询和算法应用
开发语言·c++·笔记·学习·算法
数聚天成DeepSData16 分钟前
外贸海关进出口数据去哪免费下载?从统计到明细的查找指南
linux·服务器·开发语言·前端·网络·人工智能·自然语言处理
再卷也是菜17 分钟前
C++11支持并发库
开发语言·c++
Lhan.zzZ20 分钟前
QML 开发中的“陷阱”:动态模型更新时,ComboBox 索引为何总是失效?
开发语言·qt
小园子的小菜35 分钟前
Java 并发四大工具类深度解析:CountDownLatch、CyclicBarrier、Semaphore、Exchanger 原理、源码与面试考点
java·开发语言·面试
六月的翅膀44 分钟前
OCR:RapidOCR C++/C#
c++·ocr
河西石头1 小时前
再谈C#的抽象类和接口:从“适配器”到“毛坯房”的设计哲学
开发语言·c#·接口·依赖注入·抽象类·依赖倒挂
颜x小1 小时前
[C#]——接口与继承
开发语言·c++·c#
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-17 爬动的蠕虫(C语言实现)
c语言·开发语言·数据结构·算法