新闻中心
c++条件变量std::condition_variable怎么使用_c++线程等待与条件同步实现
std::condition_variable 配合 mutex 实现线程同步,避免轮询。生产者加锁入队后 notify,消费者 wait 满足条件后处理数据,使用谓词防止虚假唤醒,notify_one 唤醒单个线程,notify_all 用于广播状态。

在C++多线程编程中,std::condition_variable 是实现线程间同步的重要工具。它通常配合 std::mutex 使用,用于让一个或多个线程等待某个特定条件成立后再继续执行。这种机制避免了轮询带来的资源浪费,提高了程序效率。
基本使用步骤
要正确使用 std::condition_variable,需遵循以下核心流程:
- 使用 std::unique_lock<:mutex> 锁定共享数据
- 在等待线程中调用 wait() 方法,自动释放锁并阻塞
- 在条件满足的线程中调用 notify_one() 或 notify_all()
- 被唤醒的线程重新获取锁,继续执行
简单生产者-消费者示例
下面是一个典型的使用场景:一个生产者线程向队列添加数据,一个消费者线程等待并处理数据。
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> data_queue;
std::mutex mtx;
std::condition_variable cv;
bool finished = false;
void producer() {
for (int i = 0; i < 5; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::unique_lock<std::mutex> lock(mtx);
data_queue.push(i);
std::cout << "Produced: " << i << "\n";
lock.unlock();
cv.notify_one(); // 唤醒一个等待线程
}
{
std::unique_lock<std::mutex> lock(mtx);
finished = true;
}
cv.notify_one();
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
// 等待条件:队列非空 或 生产结束
cv.wait(lock, [] {
return !data_queue.empty() || finished;
});
if (!data_queue.empty()) {
int value = data_queue.front();
data_queue.pop();
std::cout << "Consumed: " << value << "\n";
}
if (data_queue.empty() && finished) {
break;
}
lock.unlock();
}
}
主函数启动两个线程:
千鹿Pr助手
智能Pr插件,融入众多AI功能和海量素材
128
查看详情
int main() {
std::thread p(producer);
std::thread c(consumer);
p.join();
c.join();
return 0;
}
wait 的两种形式
cv.wait(lock) 会一直阻塞直到被 notify 唤醒,然后重新获取锁。但这样可能产生虚假唤醒(spurious wakeup),所以推荐使用带谓词的版本:
cv.wait(lock, []{ return !data_queue.empty(); });
这个版本会自动检查条件,若不满足则继续等待,无需手动循环判断。
notify_one 与 notify_all 区别
- notify_one():唤醒至少一个等待线程,适用于单一任务分配场景
- notify_all():唤醒所有等待线程,适用于广播状态变化(如终止信号)
注意:notify 调用本身不释放锁,通常应在持有锁时调用,以确保状态更新对等待线程可见。
基本上就这些。掌握 condition_variable 的关键是理解“锁 + 条件变量 + 状态标志”的组合模式,合理使用谓词等待避免逻辑错误。以上就是c++++条件变量std::condition_variable怎么使用_c++线程等待与条件同步实现的详细内容,更多请关注其它相关文章!
# 是一个
# 义乌网站优化营商环境
# 北京seo营销公司优化
# 全网营销推广重要性分析
# 淘宝店竞价推广营销
# 网站推广认可鹏博资讯
# 合肥公司推广网络营销
# 上门网络营销推广热线
# 罗源县网站建设
# seo乐队
# 自动化推广营销软件免费版
# 相关文章
# 推荐使用
# 两种
# 多个
# c++条件变量
# 结构化
# 配置文件
# 绑定
# 适用于
# 多线程
# 有锁
# 区别
# stream
# ios
# c++
# ai
# 工具
# 线程同步
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
天眼查企业查询官网入口 天眼查官方网页版查询
如何在 Excel Online 和 Google 表格中更改日期格式
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
J*aScript实现单选按钮与关联输入框的联动禁用教程
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
c++ dfs和bfs代码 c++深度广度优先搜索算法
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
必由学官网快捷入口 必由学网页版在线学习平台
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
2026春节假期票务安排_2026春节放假购票指南
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
期待已久:小米17 Ultra、小米首款NAS本月登场
在Go Martini框架中高效服务动态生成图像的实践指南
解决深度学习模型训练初期异常高损失与完美验证准确率问题
Win11怎么开启高性能模式_Windows 11电源计划优化设置
React中useState与局部变量:理解组件状态管理与渲染机制
《刺客信条:影》PS5 Pro和Switch 2画面对比
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
在Pyomo中实现基于变量的条件约束:Big-M方法详解
ArrayList与LinkedList核心操作的Big-O复杂度分析
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
汽车之家官方网站官网入口_汽车之家网页版直接进入
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
PDF文件体积过大处理_PDF压缩技巧详解
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
AO3同人作品网入口 AO3搜索引擎官网永久地址
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
Angular Material 垂直步进器:实现底部到顶部排序的教程
火锅吃太多会怎样 火锅吃太多会上火吗
小米14应用无法联网原因分析_小米14网络权限修复
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
b站如何看历史记录_b站观看历史找回方法
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
机器学习中对数变换预测结果的反向还原
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
Win11怎么关闭快速启动_Win11彻底关机设置教程
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用


2025-11-12
浏览次数:次
返回列表
lock.unlock();
}
}