当前位置: 首页 > news >正文

std::condition_variable的使用说明(详细解释和使用示例)

概述

std::condition_variable 是 C++ 标准库中用于线程间通信的同步原语。它允许一个或多个线程等待某个条件为真。通常与 std::mutex 一起使用,std::condition_variable 提供了两种主要的等待方式:waitwait_for

使用说明

  1. 初始化std::condition_variable 通常作为类的成员变量进行初始化。
  2. 等待:使用 waitwait_for 方法来阻塞当前线程,直到条件满足。
  3. 通知:使用 notify_onenotify_all 方法来唤醒等待的线程。

关键方法

  • void wait(std::unique_lock<std::mutex>& lock);

    • 使当前线程阻塞,直到条件变量被通知。
    • 调用 wait 之前,必须先对 std::mutex 进行上锁,并将锁对象传递给 wait 方法。
    • 当线程被唤醒时,它会自动重新获取锁。
  • template<class Rep, class Period> std::cv_status wait_for(std::unique_lock<std::mutex>& lock, const std::chrono::duration<Rep, Period>& rel_time);

    • 使当前线程阻塞指定的时间长度,或者直到条件变量被通知。
    • 如果在指定的时间内没有被通知,则返回 std::cv_status::timeout
  • void notify_one();

    • 唤醒一个正在等待的线程。
    • 如果有多个线程在等待,选择哪个线程被唤醒是不可预测的。
  • void notify_all();

    • 唤醒所有正在等待的线程。

使用示例

下面是一个简单的示例,展示了如何使用 std::condition_variable 来实现线程间的同步。这个例子中,主线程等待子线程完成某个任务。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>class Task {
public:void execute() {std::unique_lock<std::mutex> lock(mutex_);std::cout << "模拟一个耗时任务,开始!" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "模拟一个耗时任务,结束!" << std::endl;status_ = true;// 通知等待的线程cv_.notify_one();}void waitUntilCompleted() {std::unique_lock<std::mutex> lock(mutex_);std::cout << "使用 wait 来等待任务完成!" << std::endl;cv_.wait(lock, [this]{ return status_; });// 当 wait 返回时,说明 status_ 为 truestd::cout << "任务已完成!" << std::endl;}private:std::mutex mutex_;std::condition_variable cv_;bool status_ = false;
};int main() {Task task;// 启动一个新线程执行任务std::thread worker([&task](){ task.execute(); });// 主线程等待任务完成task.waitUntilCompleted();std::cout << "等待子线程结束!" << std::endl;worker.join();std::cout << "子线程已结束!" << std::endl;return 0;
}

说明

  • execute 方法:模拟了一个耗时任务。在任务完成后,设置 status_true,并使用 notify_one 通知等待的线程。
  • waitUntilCompleted 方法:使用 wait 方法来等待 status_ 变为 truewait 方法的第一个参数是一个 std::unique_lock<std::mutex>,第二个参数是一个 lambda 表达式,该表达式返回一个布尔值,表示等待的条件。
  • main 函数:创建了一个 Task 对象,并启动了一个子线程来执行任务。主线程调用 waitUntilCompleted 方法来等待任务完成,然后等待子线程结束。

在这个示例中,std::condition_variable 被用来实现在任务完成时通知等待的线程。这样可以有效地避免 busy-waiting(忙等待),提高程序的性能和响应性。

执行结果

在这里插入图片描述

相关文章:

  • YOLOv3损失函数与训练模块的源码解析
  • Web:Swagger 生成文档后与前端的对接
  • rebase master后会将master的commit历史加入这个分支吗
  • bat脚本执行完后自动删除
  • 第七讲、在Isaaclab中使用交互式场景
  • 微信小程序腾讯获得所在城市
  • Python multiprocessing模块Pool类介绍
  • DeepReaserch写的文献综述示例分享
  • 【Kubernetes基础--Pod深入理解】--查阅笔记2
  • vmcore分析锁问题实例(x86-64)
  • 站台候车,好奇铁道旁的碎石(道砟)为何总是黄色的?
  • Spark-SQL核心编程2
  • redis 内存中放哪些数据?
  • Transformer-PyTorch实战项目——文本分类
  • Tessent Scan Stream Network (SSN) 在芯片设计DFT中的架构、实现原理及组成
  • coco128数据集格式
  • 信息系统项目管理工程师备考计算类真题讲解三
  • What are the advantages of our neural network inference framework?
  • 【Sequelize】关联模型和孤儿记录
  • C#中async await异步关键字用法和异步的底层原理
  • 两岸基层民生发展交流会在浙江开幕
  • 解除近70家煤电厂有毒物质排放限制,特朗普能重振煤炭吗?
  • 因在罗博特科并购项目中执业违规,东方证券、国浩所均遭警示
  • 李强签署国务院令,公布《国务院关于修改〈快递暂行条例〉的决定》
  • 云南:近两千亩拍得土地因规划变更不得开发,政府要求转型、企业无力为继
  • 今年1-3月全国吸收外资2692.3亿元人民币