【问题标题】:receiving messages with high frequence, asking for the 'best' thread model高频接收消息,要求“最佳”线程模型
【发布时间】:2014-12-18 10:05:39
【问题描述】:

我们正计划在我们的软件中重新设计一个框架模块。该模块从现场总线(CAN 总线)接收消息。消息量可高达每秒 3000 条。单个消息相当小(8 字节加一或两个 int)。 驱动程序的要求是,我必须在每个通道中至少使用一个阻塞接收函数调用。有两个或四个通道可以支持。 接收消息的对象数量多达80个。今天每个对象都有自己的接收线程,这有一些缺点。一条消息可以有多个接收对象。 对象也将由计时器触发并相互交互。

每个对象都可以在自己的线程中运行,但这不是必需的。有可能所有对象只在一个线程中运行。

编程语言是C++;操作系统是 Windows 7。我们正在使用 boost.thread 并计划使用 boost.asio。一般来说,我们的软件在四核 PC 上运行。

我的问题是:在多个线程上分配工作的“最佳”线程模型是什么? 我们应该直接调用接收线程中的对象吗?我们应该在接收对象拥有的第二个线程中发布消息吗?如果是,我们应该使用线程组还是池?

【问题讨论】:

  • 你所有的“模型”都是可行的。我建议您使用所有这些设置测试,看看哪些最适合您的系统(不仅在吞吐量方面,而且还包括它如何与系统的其余部分集成,以及可能的其他考虑因素)。
  • 好建议,但这会导致一些额外的工作。我希望有一些点击或提示,或者其他人的一些经验。什么是我必须看的东西?

标签: c++ windows multithreading boost-asio


【解决方案1】:

我希望得到一些点击或提示...

注意:这只是一个提示。

我有一个类似的问题要解决,并进行了一些测试和测量。正如 Joachim Pileborg 在他的评论中提到的那样,所有模型都是可行的。正如您使用 boost.asio 提到的,这是我的结果:

异步:

同步:

这些值是以毫秒为单位的响应时间延迟(从大约 1M 的列表中提取大约 3000 个数据包),但不是必需的。重要的是,同步似乎更稳定。

这实际上取决于您打算如何以及计划做什么(例如,它是否时间紧迫,包必须是无损的),但在我的情况下,最好的选择是接收同步,每个接收器有 1 个线程(6 个通道,其中使用,所以 6 个线程),并在一个线程中发送异步,因为没有真正的时间关键。

我想保持简短的回答,所以希望这对你有所帮助。

【讨论】:

  • 感谢您的回答。你能解释一下我在两张图片上看到的确切内容吗?我想最下面的图像显示您的“最佳选择”。如果您生产上面的线程,线程是否正常工作?
  • 对不起,如果我的回答有点误导。这些图像向您展示了使用异步/非阻塞模型的响应时间(尽管使用池与不使用池没有太大区别),而第二张图像使用了阻塞模型。我的问题是,接收延迟(我必须低于 2.5 毫秒)。但是发送没有问题,因为它并不重要(我对数据进行了插值/外推)。所以我最好的选择是混合。为每个通道使用一个线程来接收(绑定 -> no pool),但对所有通道使用一个线程来发送。
  • @cpp-progger 我建议你做一个小测试,什么对你来说更好。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多