c++条件变量condition_variable怎么用_c++多线程通信实现【详解】

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

c++条件变量condition_variable怎么用_c++多线程通信实现【详解】-第1张图片-佛山资讯网

条件变量 std::condition_variable 本身不带“条件”,它只是让线程能安全地等待某个共享状态改变;真正起作用的是你用互斥锁保护的、手动检查的那个“条件”。用错的关键,往往不是不会调用 wait()notify_one(),而是忘了:必须在循环中检查条件、必须用锁保护共享数据、通知和等待必须看到同一把锁。

核心配合:必须和 mutex 一起用

条件变量不能单独使用,它依赖 std::mutex 来保护被等待的共享状态。典型结构是:

  • 加锁(lock_guardunique_lock
  • 检查条件(比如 queue.empty()
  • 若不满足,调用 cv.wait(lock, predicate) —— 它会自动解锁并挂起,被唤醒时自动重新加锁
  • 条件满足后继续执行临界区逻辑

注意:wait() 的第二个参数是个可调用对象(lambda 最常用),它会在每次被唤醒后重新求值;返回 false 就继续等,true 才退出等待。这天然支持「虚假唤醒」防护。

通知时机:notify\_one 和 notify\_all 的区别

notify_one() 唤醒**至少一个**正在 wait 的线程(具体哪个由系统调度决定);notify_all() 唤醒所有等待线程。

立即学习“C++免费学习笔记(深入)”;

标签: ai c++ 区别 red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~