新闻中心
c++怎么使用条件变量std::condition_variable_c++多线程条件变量用法
std::condition_variable需与std::unique_lock配合使用,通过wait()等待条件并释放锁,由notify_one()或notify_all()唤醒线程,常用于生产者-消费者模型,需用谓词避免虚假唤醒,确保线程安全同步。

在C++多线程编程中,std::condition_variable 是一个重要的同步机制,用于在线程之间协调“等待-通知”操作。它通常与 std::unique_lock<:mutex> 配合使用,让某个线程等待特定条件成立,而另一个线程在条件达成时发出通知。
基本用法:等待与唤醒
std::condition_variable 的核心是两个方法:wait() 和 notify_one() 或 notify_all()。
典型使用场景包括生产者-消费者模型、任务队列等。下面是一个简单的例子:
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker_thread() {
std::unique_lock<std::mutex> lock(mtx);
// 等待直到 ready 为 true
cv.wait(lock, []{ return ready; });
std::cout << "工作线程开始执行任务\n";
}
void main_thread() {
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // 唤醒一个等待的线程
}
int main() {
std::thread t1(worker_thread);
std::thread t2(main_thread);
t1.join();
t2.join();
return 0;
}
关键点说明
- 必须配合互斥锁使用:condition_variable 的 wait 操作需要传入 unique_lock,不能单独使用。
- wait 会自动释放锁:调用 wait 时,线程释放锁并进入阻塞状态;被唤醒后重新获取锁再继续执行。
- 使用 lambda 判断条件:推荐在 wait 第二个参数传入谓词(如 []{return ready;}),避免虚假唤醒导致的问题。
- notify_one vs notify_all:notify_one() 唤醒一个等待线程,notify_all() 唤醒所有等待线程,根据场景选择。
生产者-消费者示例
更实用的例子:多个线程处理任务队列。
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
std::queue<int> tasks;
std::mutex task_mutex;
std::condition_variable task_cv;
bool finished = false;
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(task_mutex);
// 等待任务或结束信号
task_cv.wait(lock, []{ return !tasks.empty() || finished; });
if (finished && tasks.empty()) {
lock.unlock();
break;
}
int task = tasks.front();
tasks.pop();
lock.unlock();
std::cout << "处理任务: " << task << "\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void producer() {
for (int i = 1; i <= 5; ++i) {
{
std::lock_guard<std::mutex> lock(task_mutex);
tasks.push(i);
}
task_cv.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
{
std::lock_guard<std::mutex> lock(task_mutex);
finished = true;
}
task_cv.notify_all(); // 唤醒所有消费者结束
}
int main() {
std::thread c(consumer);
std::thread p(producer);
p.join();
c.join();
return 0;
}
基本上就这些。掌握 condition_variable 的关键是理解它和互斥锁的协作方式,以及如何安全地传递状态变化。只要注意加锁、使用谓词等待、及时通知,就能写出可靠的多线程代码。
以上就是c++++怎么使用条件变量std::condition_variable_c++多线程条件变量用法的详细内容,更多请关注其它相关文章!
# 相关文章
# 温州在线推广招聘网站
# 阜新网站建设
# 宁波seo 代发
# 常绿网站建设价格
# 网站制作和推广电话
# 律师推广网站哪个好点
# 沁阳网站优化收费标准
# 沧州免费网站建设
# 福建龙岩网络营销推广
# 运营推广营销难题
# 第二个
# 中文网
# 多线程
# 多个
# 就能
# 互斥
# 全局变量
# 如何使用
# 是一个
# 同步机制
# stream
# ios
# c++
# ai
# c++条件变量
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
苹果手机如何防止被恶意App追踪
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
HTML空白字符处理机制:渲染、DOM与编码实践
解决Python单元测试中Mock异常方法调用计数为零的问题
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
如何使 Jest 模拟函数默认抛出错误以提高测试效率
Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
Composer如何在生产环境安全地执行composer update
age动漫网站入口 age动漫官网直接访问入口
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
抖音极速版最新版本 抖音极速版官方下载地址
从J*aScript对象中精确提取指定属性的教程
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
解决Bootstrap卡片顶部边距导致背景图下移的问题
夸克AO3官网入口_AO3镜像网站2025推荐
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
Win11怎么开启省电模式_Win11电池节电模式自动开启
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
照顾宝贝2小游戏免费秒玩入口
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
msn官网入口地址手机版 msn官方网站手机最新链接
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
构建轻量级网站内部消息系统:Formspree 集成指南
Tabulator表格日期时间排序问题及自定义解决方案
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
字由网在线版登录地址 字由网网页版安全入口
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
响应式容器内容自动缩放与宽高比维持教程


2025-11-05
浏览次数:次
返回列表
ariable需与std::unique_lock配合使用,通过wait()等待条件并释放锁,由notify_one()或notify_all()唤醒线程,常用于生产者-消费者模型,需用谓词避免虚假唤醒,确保线程安全同步。