接收高频率的消息,要求最好的消息'线程模型

时间:2014-12-18 10:05:40

标签: c++ windows multithreading boost-asio

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  

我希望有一些点击或嘲讽......

注意:这只是一个提示。

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

<强>异步: enter image description here

同步: enter image description here

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

它真的取决于你要做的事情和方式(例如它是时间关键的,包裹必须是无损的),但在我的情况下,最好的选择是每个接收器接收同步1个线程(6个通道,其中使用,所以6个线程),并在一个线程中发送异步,因为没有真正的时间关键。

我想让答案保持简短,所以希望这会有所帮助。