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

发布于:2024-06-29 ⋅ 阅读:(117) ⋅ 点赞:(0)

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资源的浪费。

网站公告

今日签到

点亮在社区的每一天
去签到