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; });