0

0

如何用c++实现一个简单的消息队列(Message Queue) 模块解耦利器【架构设计】

尼克

尼克

发布时间:2026-01-03 19:01:35

|

382人浏览过

|

来源于php中文网

原创

C++轻量线程安全消息队列基于std::queue+mutex+condition_variable实现阻塞式生产者-消费者模型,支持模板泛型、移动语义、超时尝试及容量限制,兼顾解耦与健壮性。

如何用c++实现一个简单的消息队列(message queue) 模块解耦利器【架构设计】

用C++实现一个轻量、线程安全的消息队列,核心在于封装好生产者-消费者模型的同步逻辑,不依赖外部中间件,就能在模块间实现解耦。关键不是堆功能,而是把阻塞、通知、类型泛化这三点做稳。

标准库组件搭出线程安全队列

不需要第三方库,C++11的std::queue + std::mutex + std::condition_variable就足够。重点是让Pop操作能自动等待——队列空时不忙等,而是挂起线程,等Push发来通知再唤醒。

  • std::unique_lock<:mutex>保护所有队列读写操作
  • Pop时调用cv.wait(lock, []{ return !q.empty(); }),条件成立才继续
  • Push后立刻调用cv.notify_one(),只唤醒一个等待中的消费者
  • 若需支持多消费者并行处理,notify_one比notify_all更节省资源

支持任意消息类型的模板设计

把队列定义成模板类,比如template class BlockingQueue,这样既能传intstd::string,也能传自定义结构体或智能指针,避免强制类型转换和内存管理混乱。

  • Push内部用_queue.push(std::move(msg))减少拷贝开销
  • Pop返回bool表示是否成功取到,配合引用参数输出值,避免异常路径下的资源泄漏
  • 可选添加TryPop(T&, int timeout_ms = 0)支持带超时的非阻塞尝试

解耦场景下的典型用法

消息队列真正发挥价值的地方,是让两个原本紧耦合的模块变成“只认接口、不见对方”。比如日志模块不再直接调用文件写入函数,而是往队列里扔一条LogEntry;另一个独立线程从队列取日志、批量落盘。

剪映专业版
剪映专业版

一款全能易用的桌面端剪辑软件

下载

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

  • 生产者只需关注queue.Push(log),不用管谁消费、何时消费、失败怎么重试
  • 消费者专注处理逻辑,比如格式化+写文件+压缩归档,完全隔离业务主流程
  • 如果某天要加Kafka上报,只需新增一个消费者线程,原系统代码零改动

注意边界与健壮性细节

简单不等于简陋。几个容易忽略但影响稳定性的点:

  • 队列应设容量上限(如max_size = 1024),Push前检查,满则阻塞或丢弃/告警,防内存无限增长
  • 提供Close()接口标记队列关闭,Pop检测到后主动退出循环,便于优雅停机
  • 若需跨进程通信,可切换为Boost.Interprocess或POSIX消息队列,但单进程内优先用标准库,更可控

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

175

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

166

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2024.02.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

漫蛙2入口地址合集
漫蛙2入口地址合集

本专题整合了漫蛙2入口汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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