我们计划在我们的软件中重新设计框架模块。该模块从现场总线(CAN总线)接收消息。消息量最多可达每秒3000个。单个消息相当小(8个字节加一个或两个int)。 驱动程序的要求是,每个通道必须至少使用一个阻塞接收函数调用。有两个或四个渠道可供支持。 接收消息的对象数量最多为80.今天,每个对象都有自己的接收线程,这有一些缺点。一条消息可以有多个接收对象。 对象也将从定时器触发并相互交互。
每个对象都可以在自己的线程中运行,但这不是必需的。所有对象可能只在一个线程中运行。
编程语言是C ++;操作系统是Windows 7.我们正在使用boost.thread并计划使用boost.asio。一般来说,我们的软件在四核PC上运行。
我的问题是:在多个线程上分配工作的“最佳”线程模型是什么? 我们应该直接调用接收线程中的对象吗?我们应该在接收对象拥有的第二个线程中发布消息吗?我们应该使用线程组或池,如果是,如何?
答案 0 :(得分:0)
我希望有一些点击或嘲讽......
我有一个类似的问题要解决,并做了一些测试和测量。正如Joachim Pileborg在评论中提到的,所有模型都是可行的。正如你提到的使用boost.asio这里是我的结果:
<强>异步:强>
同步:强>
值是以毫秒为单位的响应时间延迟(从大约1M的列表中提取约3000个数据包),但不是必需的。重要的是,同步似乎更稳定。
它真的取决于你要做的事情和方式(例如它是时间关键的,包裹必须是无损的),但在我的情况下,最好的选择是每个接收器接收同步1个线程(6个通道,其中使用,所以6个线程),并在一个线程中发送异步,因为没有真正的时间关键。
我想让答案保持简短,所以希望这会有所帮助。