需配合使用std::mutex、std::condition_variable和共享缓冲容器;wait必须用while循环防虚假唤醒;notify_one更高效;cv.wait(lock)原子地释放锁、等待、重加锁。

用 std::condition_variable 实现生产者消费者模型,核心是让生产者在缓冲区满时等待,消费者在缓冲区空时等待,同时用互斥锁保护共享队列,用条件变量精准唤醒对应线程。
需要哪些同步组件
必须配合使用三样东西:std::mutex(保护共享队列)、std::condition_variable(协调等待与唤醒)、一个共享的缓冲容器(如 std::queue)。不能只用条件变量,它不带状态,也不提供互斥能力。
关键逻辑:wait() 必须搭配 while 循环检查条件
不能写成 if (queue.empty()) cv.wait(lock),因为存在虚假唤醒(spurious wakeup)和条件变化竞争。正确写法是:
-
while (queue.empty()) cv.wait(lock);—— 消费者等非空 -
while (queue.size() >= capacity) cv.wait(lock);—— 生产者等有空位
每次被唤醒后都要重新检查条件是否真正满足,这是安全前提。
立即学习“C++免费学习笔记(深入)”;
notify_one() 还是 notify_all()?
一般用 notify_one() 就够了:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~