全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何使用条件变量_C++多线程同步std::condition_variable的等待与通知

std::condition_variable用于线程同步,配合unique_lock实现等待通知机制。生产者修改共享状态并调用notify唤醒消费者,消费者通过wait阻塞直至条件满足。使用谓词可避免虚假唤醒,确保数据一致性与线程安全。

在C++多线程编程中,std::condition_variable 是实现线程间同步的重要工具之一。它通常与 std::unique_lock<:mutex> 配合使用,用于阻塞一个或多个线程,直到另一个线程修改了某个共享状态并通知它们继续执行。

条件变量的基本原理

条件变量允许线程在某个条件不满足时进入等待状态,避免频繁轮询消耗CPU资源。当其他线程改变了这个条件后,通过发送“通知”来唤醒等待中的线程。

核心机制包括:

  • wait():使当前线程阻塞,直到被唤醒
  • notify_one():唤醒一个正在等待的线程
  • notify_all():唤醒所有等待的线程

基本用法:等待与通知

以下是一个典型的生产者-消费者模型示例,展示如何使用 std::condition_variable 实现线程同步:

#include 
#include 
#include 
#include 
#include 

std::queue 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 lock(mtx);
        data_queue.push(i);
        std::cout << "生产: " << i << "\n";
        lock.unlock();
        cv.notify_one(); // 通知消费者
    }
    {
        std::lock_guard lock(mtx);
        finished = true;
    }
    cv.notify_all(); // 通知所有消费者结束
}

void consumer() {
    while (true) {
        std::unique_lock 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();
    }
}

在上面的例子中:

  • 生产者每隔一段时间向队列添加数据,并调用 notify_one()
  • 消费者调用 wait(),传入锁和一个lambda表达式作为谓词(predicate)
  • 只有当谓词返回 true 时,wait 才会解除阻塞
  • 使用谓词可以防止虚假唤醒导致的问题

关键注意事项

正确使用 std::condition_variable 需要注意以下几点:

  • 必须配合 std::unique_lock<:mutex> 使用,不能用 lock_guard
  • wait 调用会自动释放锁,在唤醒后重新获取锁,保证安全性
  • 始终使用带谓词的 wait 形式(即 wait(lock, predicate)),避免虚假唤醒问题
  • 通知方修改共享数据时也应持有同一互斥锁,确保数据一致性
  • 如果可能唤醒多个消费者,考虑使用 notify_all() 替代 notify_one()

基本上就这些。合理使用条件变量可以让多线程程序更高效、响应更及时,同时避免忙等待带来的性能浪费。掌握 wait 和 notify 的配对逻辑是关键。


# 工具  # ai  # c++  # ios  # stream  # red  # Lambda  # 线程  # 多线程  # 多个  # 是一个  # 才会  # 几点  # 在上面  # 不能用  # 也应  # 每隔  # 如何使用 


相关文章: 在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何快速重置建站主机并恢复默认配置?  TestNG的testng.xml配置文件怎么写  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何自定义建站之星模板颜色并下载新样式?  建站之星备案流程有哪些注意事项?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  如何彻底卸载建站之星软件?  如何在宝塔面板创建新站点?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  建站主机是否属于云主机类型?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何通过免费商城建站系统源码自定义网站主题与功能?  存储型VPS适合搭建中小型网站吗?  如何在Ubuntu系统下快速搭建WordPress个人网站?  建站VPS推荐:2025年高性能服务器配置指南  香港服务器租用每月最低只需15元?  如何快速搭建个人网站并优化SEO?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何破解联通资金短缺导致的基站建设难题?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站之星安装需要哪些步骤及注意事项?  如何在阿里云服务器自主搭建网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  黑客入侵网站服务器的常见手法有哪些?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何在阿里云ECS服务器部署织梦CMS网站?  如何在万网ECS上快速搭建专属网站?  全景视频制作网站有哪些,全景图怎么做成网页?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  太平洋网站制作公司,网络用语太平洋是什么意思?  linux top下的 minerd 木马清除方法  制作网站外包平台,自动化接单网站有哪些?  深入理解Android中的xmlns:tools属性  重庆网站制作公司哪家好,重庆中考招生办官方网站?  专业网站建设制作报价,网页设计制作要考什么证?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  网站制作网站,深圳做网站哪家比较好?  如何在搬瓦工VPS快速搭建网站?  北京企业网站设计制作公司,北京铁路集团官方网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  XML的“混合内容”是什么 怎么用DTD或XSD定义  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站之星安装路径如何正确选择及配置?  如何通过IIS搭建网站并配置访问权限?  如何快速生成可下载的建站源码工具? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。