std::condition_variable用于线程同步,配合std::mutex实现等待-通知机制,如生产者-消费者模型中,通过wait()阻塞线程直到条件满足,notify_one()或notify_all()唤醒线程,需用unique_lock并结合谓词防止虚假唤醒,确保正确处理共享状态。

在C++多线程编程中,std::condition_variable 是实现线程间同步的重要工具之一。它通常与 std::mutex 配合使用,用于让一个或多个线程等待某个条件成立,而另一个线程在条件满足时通知等待的线程继续执行。
条件变量不是用来保护共享数据的,而是用来协调线程之间的执行顺序。比如生产者-消费者模型中,消费者线程需要等待缓冲区非空,而生产者在放入数据后可以通知消费者。这时就适合使用 std::condition_variable。
关键组件包括:
下面是一个简单的例子,演示如何使用条件变量实现两个线程间的协作:
#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::lock_guard<std::mutex> lock(mtx);
data_queue.push(i);
std::cout << "生产: " << i << "\n";
lock.unlock(); // 提前释放锁
cv.notify_one(); // 通知一个消费者
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
{
std::lock_guard<std::mutex> lock(mtx);
finished = true;
}
cv.notify_all(); // 通知所有等待线程结束
}
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 << "消费: " << value << "\n";
}
if (data_queue.empty() && finished) {
break; // 结束循环
}
lock.unlock();
}
}
主函数启动线程:
Animate AI
Animate AI是个一站式AI动画故事视频生成工具
234
查看详情
int main() {
std::thread p(producer);
std::thread c(consumer);
p.join();
c.join();
return 0;
}
cv.wait() 必须传入一个 unique_lock,并可选地传入一个谓词(lambda 或函数对象)。推荐始终使用带谓词的版本,避免虚假唤醒导致的问题。
两种写法对比:
带谓词的 wait 会自动循环检查条件,直到为真才返回,更安全简洁。
注意:notify 不保证立即切换到目标线程,只是使其进入就绪状态。
基本上就这些。掌握 condition_variable 的核心在于理解“等待某个条件 + 锁保护共享状态 + 正确通知”的模式。实际使用中要特别注意锁的粒度和 notify 的时机,避免死锁或遗漏唤醒。以上就是C++如何使用std::condition_variable_C++多线程同步与条件变量使用的详细内容,更多请关注其它相关文章!
# ai
# c++
# ios
# 工具
# 全网热点关键词排名
# 应援网站怎么做推广
# 襄城本地网站优化公司
# 整合营销及推广
# seo兼职招聘信息排名
# 青岛建设委员会网站
# sem和seo电商
# 武汉搜索推广网站是什么
# 渭南网站建设考试热点
# 献县seo排名
# 尼克
# 高性能
# 死锁
# 数据结构
# 适用于
# 多个
# 是一个
# 自己的
# 多线程
# 如何使用
# stream
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱
支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法
Win11怎么开启HDR_Windows 11显示器画质增强设置
如何在mysql中比较InnoDB和MyISAM区别
word表格如何按某一列内容进行排序_Word表格按列排序方法
C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析
CDR如何复制交互式填充色
《微信》视频号原创声明开启方法
b站怎么查看视频的码率_b站视频码率查看方法
优化长HTML属性值:SonarQube警告与实用策略
优化CSS动画与J*aScript定时器协同:构建稳定Toast提示
《鹿路通》退余额方法
Lar*el 关联查询:同时筛选父表与子表数据的高效策略
如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现
《长生:天机降世》火塔小怪大全
如何在解析前预检查XML文件的完整性? 比如检查文件大小或特定结束标签
视频转蓝光m2ts格式
《via浏览器》强制缩放网页设置方法
firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接
智慧团建活动报名入口 智慧团建活动报名入口手机端官网
macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整
windows10怎么更改下载路径_windows10默认存储位置修改教程
192.168.1.1路由器后台入口 192.168.1.1默认登录入口
《友玩*》创建群聊方法
《虎扑》关闭社区内容推荐方法
苹果官网国补入口在哪
抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?
在PySimpleGUI中实现键盘按键绑定按钮事件
荣耀magicv5怎么上手测评
《原神》月之一版本新增书籍一览
邮编号码查询app有哪些_邮编号码查询推荐app及使用体验
C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别
西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法
申通快件单号查询平台 申通包裹物流动态跟踪
《广发易淘金》国债逆回购操作教程
PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角
《全民k歌》网页版最新登录入口一览
《漫蛙manwa2》防走失网页版链接2025
WooCommerce 新客户订单自动添加管理员备注教程
中大网校app做题记录清除方法
宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?
芒果TV官网登录入口 芒果TV官方网站登录入口
掌握产品代码正则表达式:避免常见陷阱与精确匹配
从J*a应用程序中导出MySQL表数据的技术指南
纯CSS实现滚动时动态时间轴线条颜色填充效果
汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口
b站怎么用微信登录_b站微信登录方法
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
c++如何链接Boost库_c++准标准库的集成与使用
电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】
2025-11-16
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。