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

用 std::condition_variable 实现生产者消费者模型,核心是让生产者在缓冲区满时等待,消费者在缓冲区空时等待,同时用互斥锁保护共享队列,用条件变量精准唤醒对应线程。
必须配合使用三样东西:std::mutex(保护共享队列)、std::condition_variable(协调等待与唤醒)、一个共享的缓冲容器(如 std::queue)。不能只用条件变量,它不带状态,也不提供互斥能力。
不能写成 if (queue.empty()) cv.wait(lock),因为存在虚假唤醒(spurious wakeup)和条件变化竞争。正确写法是:
while (queue.empty()) cv.wait(lock); —— 消费者等非空while (queue.size() >= capacity) cv.wait(lock); —— 生产者等有空位每次被唤醒后都要重新检查条件是否真正满足,这是安全前提。
立即学习“C++免费学习笔记(深入)”;
一般用 notify_one() 就够了:
cv_not_empty.notify_one(),唤醒一个等待消费的线程cv_not_full.notify_one(),唤醒一个等待生产的线程除非你明确需要唤醒所有线程(比如广播式通知),否则 notify_one() 更高效、更可控,避免惊群效应。
cv.wait(lock) 会自动执行「释放锁 → 等待 → 被唤醒时重新加锁」三个动作,且整个过程是原子的。不要手动 unlock 再 wait,否则会出竞态。例如:
lock.unlock(); cv.wait(lock);
cv.wait(lock, [&]{ return !queue.empty(); }); 或分步写为 while(...) cv.wait(lock);
推荐直接用带谓词的 wait 版本,简洁又不易出错。
不复杂但容易忽略。把互斥、等待、唤醒、条件重检这四步串对,模型就稳了。
以上就是c++++如何使用条件变量std::condition_variable 实现生产者消费者模型【并发编程】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号