多个ASIO io_services是一个好的选择吗?

22
我已经开始使用Boost.ASIO进行一些简单的网络编程,对该库的理解还不是很深,所以请原谅我这个新手的问题。
目前在我的项目中,我只有一个io_service对象。用于所有异步I/O操作等。
我的理解是,可以创建多个线程,并将io_service实例的run方法传递给线程,以为io_service提供更多的线程。
我的问题是:是否使用多个io_service对象是良好的设计?例如,是否拥有2个不同的io_service实例,每个实例都有2个相关联的线程,它们会相互了解(因此相互合作),或者如果没有,它们会对彼此产生负面影响?
我的意图是为基于套接字的I/O使用1个io_service,为串行基于(tty)的I/O使用另一个io_service。

5
我认为每个应用程序最好只有一个io_service,并且可以添加任意数量的线程来服务于操作。 - Xander Tulip
3个回答

17

我们使用多个io_service是因为我们应用程序中的某些组件需要在特定的固定优先级下运行其所有工作线程,每个组件的优先级不同。因此,每个组件都被赋予了自己的io_service,并且每个组件都有其自己的执行run()的线程池。

我可以想到的其他设计方案是,如果每个IO需要不同数量的线程池,或者更与您的情况相关的是,如果无法共享线程池,例如,如果您的网络IO可以占用每个线程并使您的串行IO处于等待状态。


7
据我所知,在Michael Caisse的Boostcon ASIO演讲中(无论如何都值得观看),我相信一个观众明确提出了这个问题,并认为它是一个潜在的解决方案。我从中得出结论,它本身并没有错,可以根据您的设计使用。

2
链接显示还不能观看。大家都收到了这个错误信息吗? - default
1
@默认:我也遇到了同样的问题,它在Youtube上有吗? - Rikardo Koder
嗯,这是从2010年9月28日Boost Dev邮件列表中的链接得到的相同结果,当时我就看过了。不知道为什么它现在失效了:( - Kaz Dragon
1
一些来自 ppt 的幻灯片:http://dl.dropbox.com/u/10282384/asio_presentation_with_story.pdf 答案链接:https://dev59.com/UFnUa4cB1Zd3GeqPbIRU#6795367 - vivek.m
1
幻灯片现在可以在这里获取:http://www.cierelabs.com/slides/asio_presentation_with_story.pdf - robsn

6

这个讨论可能会很有启发性:

http://thread.gmane.org/gmane.comp.lib.boost.asio.user/1300

我没有代码在这里,但是您为什么要使用多个io_service? 我认为它使用一个io_service和多个线程在该io_service上执行run。

如果我理解正确,每个io_service都拥有一个select / epoll / whatever队列,因此拥有多个io_service类似于拥有多个独立的select / epoll循环。在某些情况下,例如大量套接字和多个CPU,这可能会有所帮助。

我不太确定的是,当多个线程都运行io_service :: run(使用相同的io_service)时。我认为这只是意味着处理程序并发运行,而select / epoll / etc.循环是“共享”的。我认为这最适合处理程序相对较长时间的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接