c++如何实现一个简单的发布订阅系统_c++ Pub/Sub模式与消息队列【设计】

admin 百科 11
C++轻量级线程安全发布-订阅系统由Publisher、Subscriber和MessageCenter三部分构成,通过字符串主题解耦模块,用mutex保护订阅表、消息队列实现发布与分发分离,支持泛型模板和值拷贝/智能指针管理数据生命周期。

c++如何实现一个简单的发布订阅系统_c++ Pub/Sub模式与消息队列【设计】-第1张图片-佛山资讯网

用C++实现一个简单的发布-订阅系统,核心是让模块之间不直接调用、不互相持有指针,靠“主题(Topic)”中转消息。它不是必须用网络或第三方库,纯内存+线程安全的轻量级设计就能满足多数本地模块通信需求。

关键结构:三要素缺一不可

一个可运行的最小Pub/Sub系统,至少包含:

  • Publisher(发布者):只管调用 Publish("topic_name", data),不关心谁收、收几次
  • Subscriber(订阅者):调用 Subscribe("topic_name") 表达兴趣,再实现自己的 OnMessage() 处理逻辑
  • MessageCenter(消息中心):全局单例,负责存主题→订阅者映射表、缓存待发消息、分发时加锁防竞争

线程安全怎么处理?别硬上mutex锁全函数

常见误区是给整个 Publish() 加大锁,导致高频发布时阻塞严重。更合理的做法是:

  • 订阅/退订操作用 std::mutex 保护内部映射表(std::map<:string std::vector>></:string>
  • 发布时把消息拷贝进队列(如 std::queue<msgpack></msgpack>),只锁入队那段
  • 分发逻辑放在独立线程里跑,从队列取、查表、遍历通知——这步可不加锁,只要确保队列读写分离

主题(Topic)用字符串还是类型?推荐字符串+泛型模板组合

初学者容易纠结“该不该用 std::type_info 当主题”。实际开发中,字符串主题更灵活:

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

标签: c++ 发布订阅 red

发布评论 0条评论)

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