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

用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++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~