2

我正在用 C++ 设计自己的消息总线,它将作为基于组件的游戏的后端。消息总线将具有以下特性:

  • 经常迭代,从第一个元素开始,到最后一个元素结束。
  • 在随机位置不经常删除元素
  • 理论上无限数量的元素
  • 理论上无限数量的消息类型
  • 需要尽可能快地运行
  • 所有元素都将包含一个指向消息处理程序的指针
  • 线程安全

我的问题是:

存储此类信息的最佳容器是什么?这不仅限于标准 C++,因此只要容器是 Windows 和 Linux 之间的跨平台,就可以使用 boost 容器。

4

2 回答 2

1

标准::列表

  • O(1) 迭代
  • O(1) 移除(假设你有一个迭代器)
  • O(1) 插入

列表的主要缺点是它们缺乏随机访问,但这与消息队列无关。

于 2013-10-23T19:21:56.337 回答
0

消息总线是一个复杂的东西,并不能简单地归结为连接到总线的单个组件的消息队列的表示。
正如评论中提到的,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对我在分布式系统(包括嵌入式!)中的所有要求最有用、便携和灵活。

于 2013-10-23T20:21:14.753 回答