消息总线的最佳容器

时间:2013-10-23 19:07:31

标签: c++ thread-safety components containers messaging

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

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

我的问题是:

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

2 个答案:

答案 0 :(得分:1)

<强>的std ::列表

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

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

答案 1 :(得分:0)

消息总线是一个复杂的事情,并不简单地归结为连接到总线的单个组件的消息队列的表示。
正如评论中所提到的,除了线程安全之外,std::queue<MessageType,std::list<MessageType> >应该满足您的主要用例,但需要考虑更多的事情。

以下是来自EventQueue.h的线程安全队列实现的示例STTCL。如果您将std::queue<__T__,std::list<__T__> >作为STTCL_DEFAULT_DEQUEIMPL(__T__)的值,则它应符合您的需求,包括特定项目的find()操作。

根据您的应用程序的使用情况,您需要从各种消息传递模式中进行选择,以便分发和订阅某些类型的消息。
当我即将处理这些主题时,我发现EAI catalog of messaging patterns非常有用。

除此之外:始终(总是!!! 是!三个感叹号离开消息有效负载来自运输!!

用于消息传递模式的值得注意的传输系统是0MQ,它为各种语言提供绑定。但其他可用于C ++实现(包括基于原始套接字的实现或s.th.,如boost::asio)。

至于消息有效负载的设计,我发现Google Protocol Buffers对分布式系统(包括嵌入式系统)的所有要求最有用,最便携和灵活。