我正在用 C++ 设计自己的消息总线,它将作为基于组件的游戏的后端。消息总线将具有以下特性:
- 经常迭代,从第一个元素开始,到最后一个元素结束。
- 在随机位置不经常删除元素
- 理论上无限数量的元素
- 理论上无限数量的消息类型
- 需要尽可能快地运行
- 所有元素都将包含一个指向消息处理程序的指针
- 线程安全
我的问题是:
存储此类信息的最佳容器是什么?这不仅限于标准 C++,因此只要容器是 Windows 和 Linux 之间的跨平台,就可以使用 boost 容器。
我正在用 C++ 设计自己的消息总线,它将作为基于组件的游戏的后端。消息总线将具有以下特性:
我的问题是:
存储此类信息的最佳容器是什么?这不仅限于标准 C++,因此只要容器是 Windows 和 Linux 之间的跨平台,就可以使用 boost 容器。
标准::列表
列表的主要缺点是它们缺乏随机访问,但这与消息队列无关。
消息总线是一个复杂的东西,并不能简单地归结为连接到总线的单个组件的消息队列的表示。
正如评论中提到的,std::queue<MessageType,std::list<MessageType> >
除了线程安全之外,还应该满足您的主要用例,但还有很多事情需要考虑。
这是线程安全队列实现的示例: EventQueue.h from STTCL。如果您将其std::queue<__T__,std::list<__T__> >
作为值放置,STTCL_DEFAULT_DEQUEIMPL(__T__)
则它应该适合您的需求,包括对find()
特定项目的操作。
根据您的应用程序的用例,您需要从各种消息传递模式中进行选择,以便分发和订阅某些类型的消息。
当我即将处理这些主题时,我发现EAI 消息传递模式目录非常有用。
除此之外:总是(总是!!! 是的!三个感叹号)从传输中离开消息有效负载!
一个值得注意的消息传递模式传输系统是0MQ,它为各种语言提供绑定。但其他可用于 C++ 实现(包括基于原始套接字的实现或 s.th. like boost::asio
)。
至于消息负载的设计,我发现Google Protocol Buffers对我在分布式系统(包括嵌入式!)中的所有要求最有用、便携和灵活。