新闻中心

c++怎么使用条件变量std::condition_variable_c++多线程条件变量用法

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

c++怎么使用条件变量std::condition_variable_c++多线程条件变量用法

在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分析教程  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  响应式容器内容自动缩放与宽高比维持教程 

搜索