std::condition_variable 必须与 mutex 配合使用,通过循环检查加锁保护的共享条件,wait() 自动处理解锁/重锁,notify_one() 或 notify_all() 用于唤醒等待线程,需注意通知时机与虚假唤醒防护。

条件变量 std::condition_variable 本身不带“条件”,它只是让线程能安全地等待某个共享状态改变;真正起作用的是你用互斥锁保护的、手动检查的那个“条件”。用错的关键,往往不是不会调用 wait() 或 notify_one(),而是忘了:必须在循环中检查条件、必须用锁保护共享数据、通知和等待必须看到同一把锁。
核心配合:必须和 mutex 一起用
条件变量不能单独使用,它依赖 std::mutex 来保护被等待的共享状态。典型结构是:
- 加锁(
lock_guard或unique_lock) - 检查条件(比如
queue.empty()) - 若不满足,调用
cv.wait(lock, predicate)—— 它会自动解锁并挂起,被唤醒时自动重新加锁 - 条件满足后继续执行临界区逻辑
注意:wait() 的第二个参数是个可调用对象(lambda 最常用),它会在每次被唤醒后重新求值;返回 false 就继续等,true 才退出等待。这天然支持「虚假唤醒」防护。
通知时机:notify\_one 和 notify\_all 的区别
notify_one() 唤醒**至少一个**正在 wait 的线程(具体哪个由系统调度决定);notify_all() 唤醒所有等待线程。
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~