【C++多线程】std::condition_variable到底是什么

2024年6月29日,周日下午


std::condition_variable 是C++11标准库中用于线程同步的一个设施,它通常与 std::unique_lockstd::mutex 结合使用,允许一个线程在某些条件成立之前挂起(等待),而另一个线程可以通知(唤醒)等待的线程。

以下是 std::condition_variable 的一些基本特点和使用场景:

  1. 基本概念
    • std::condition_variable 本身不提供任何互斥机制,它依赖于外部提供的互斥锁(通常是 std::mutex)来保证线程安全。
    • 它允许线程在某个条件尚未满足时暂停执行,并且可以由另一个线程在条件满足时唤醒它。
  2. 使用场景
    • 当一个线程需要等待某个条件成立才能继续执行时,例如等待某个数据准备好或某个事件发生。
    • 当一个线程需要通知一个或多个正在等待的线程某个条件已经满足时。
  3. 主要方法
    • wait(std::unique_lock<std::mutex>& lock):挂起当前线程,直到另一个线程调用 notify_one()notify_all()。调用时需要提供一个互斥锁的引用,该锁将在等待期间被解锁,并在唤醒后自动重新锁定。
    • wait(std::unique_lock<std::mutex>& lock, std::function<bool()> pred):与上面的 wait 方法类似,但它接受一个条件判断函数 pred。线程将等待直到 pred() 返回 true
    • notify_one():唤醒一个正在等待的线程(如果有)。
    • notify_all():唤醒所有正在等待的线程。
  4. 示例
    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    std::mutex mtx;
    std::condition_variable cv;
    bool ready = false;
    void prepare() {
        std::unique_lock<std::mutex> lock(mtx);
        // 准备工作...
        ready = true;
        cv.notify_one(); // 唤醒一个等待的线程
    }
    void process() {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{return ready;}); // 等待条件成立
        // 处理工作...
    }
    int main() {
        std::thread t1(prepare);
        std::thread t2(process);
        
        t1.join();
        t2.join();
        
        return 0;
    }
    
    在这个例子中,process 函数会等待 prepare 函数设置 readytrueprepare 函数完成后会通知 process 函数继续执行。
    std::condition_variable 是一种强大的同步机制,它使得线程间的协调变得更加灵活和高效,避免了不必要的CPU资源的浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值