0

0

C++如何实现一个阻塞队列?C++生产者消费者模型实战【多线程】

穿越時空

穿越時空

发布时间:2025-12-19 19:37:55

|

485人浏览过

|

来源于php中文网

原创

用std::queue+mutex+condition_variable可实现线程安全阻塞队列:pop()用while循环等待非空并取数,push()加锁入队后notify_one;支持移动语义与生产者-消费者模型。

c++如何实现一个阻塞队列?c++生产者消费者模型实战【多线程】

std::queue + std::mutex + std::condition_variable 就能实现一个线程安全、真正阻塞的队列,核心是让取数据的线程在队列空时“等通知”,而不是轮询或报错。

阻塞队列的基本结构

它要支持两个关键操作:push()(生产者调用)和 pop()(消费者调用)。pop 必须阻塞直到有数据;push 一般不阻塞(也可加容量限制做成有界队列)。

需要封装以下成员:

  • 一个 std::queue 存数据
  • 一个 std::mutex 保护队列读写
  • 一个 std::condition_variable 用于通知“有新数据了”

实现 pop():空时自动等待

pop 要做三件事:加锁 → 检查是否为空 → 为空就 wait() → 有数据就取走并返回。

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

注意必须用 while 循环检查条件(不是 if),防止虚假唤醒:

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载
void pop(T& item) {
    std::unique_lock lock(mtx);
    cv.wait(lock, [this] { return !q.empty(); }); // 等待非空
    item = std::move(q.front());
    q.pop();
}

实现 push():插入后发通知

push 只需加锁、入队、解锁,然后调用 cv.notify_one()(或 notify_all)告诉至少一个等待的消费者可以取了:

void push(const T& item) {
    std::lock_guard lock(mtx);
    q.push(item);
    cv.notify_one(); // 唤醒一个等待 pop 的线程
}

如果希望支持移动语义,push 重载一个右值引用版本会更高效。

生产者消费者实战小例子

开两个线程:一个每秒 push 一个数字;另一个不停 pop 并打印。主函数用 join() 等待结束:

BlockingQueue bq;
std::thread t1([&]{ for (int i = 0; i < 5; ++i) { bq.push(i); std::this_thread::sleep_for(1s); } });
std::thread t2([&]{ int x; for (int i = 0; i < 5; ++i) { bq.pop(x); std::cout << "got " << x << '\n'; } });

t1.join(); t2.join();

输出顺序可能交错,但不会漏数、不会崩溃——这就是阻塞队列+条件变量的威力。

基本上就这些。不复杂但容易忽略 while 条件检查和 notify 的时机,写对了就能稳稳跑多线程。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

736

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

84

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号