(13)std::condition_variable

std::condition_variable 是 C++11 引入的同步原语,
它用于线程间通信,允许一个或多个线程等待某个条件成立,直到另一个线程发出通知。
它是实现生产者-消费者模型、任务队列、事件等待等多线程模式的核心工具。

条件变量本身不存储状态,它只是一个“通知机制”。
它必须与 std::mutex 配合使用。
线程通过 wait() 等待条件,另一个线程通过 notify_one() 或 notify_all() 唤醒等待的线程。
std::mutex mtx;
std::condition_variable cv;
bool ready = false;

// 等待线程
std::thread waiter([&]() {
    // 注意:必须用 unique_lock(支持手动锁定和解锁),而 std::lock_guard 不支持。
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, []{ return ready; }); // 等待 ready 为 true
    // 条件满足,继续执行
    std::cout << "Waiter: Condition is true!\n";
});

// 通知线程
std::thread notifier([&]() {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_one(); // 通知一个等待者
});
notify_one() // 唤醒一个正在等待的线程(如果有多个)。
notify_all() // 唤醒所有等待的线程。
注意:虚假唤醒
// 错误:不检查条件
cv.wait(lock);
if (ready) { ... }

// 正确:使用 predicate
cv.wait(lock, []{ return ready; });
posted @ 2019-06-24 22:42  osbreak  阅读(282)  评论(0)    收藏  举报