多个ASIO io_services是一件好事吗?

时间:2011-05-19 07:53:56

标签: c++ boost asynchronous network-programming boost-asio

我已经开始使用Boost.ASIO进行一些简单的网络编程了,我对图书馆的了解不是很多,所以请耐心等待我和我的新手问题。

在我的项目中,我只有1 io_service个对象。哪个用于所有异步I / O操作等。

我的理解是,可以创建多个线程并将io_service实例的run方法传递给线程,以便为io_service提供更多线程。

我的问题:拥有多个io_service个对象是不错的设计?例如,有2个不同的io_service实例,每个实例有2个线程相关联,它们是否以某种方式相互了解(因此与每个实体相互配合),或者如果不是,它们会相互产生负面影响吗?

我的目的是为基于套接字的I / O提供1 io_service,为基于串口(tty)的I / O提供另一个{{1}}。

3 个答案:

答案 0 :(得分:16)

我们使用多个io_service,因为我们的应用程序中的某些组件需要以某些固定优先级运行所有工作线程,每个组件都有不同的优先级。因此,每个组件都有自己的io_service,每个组件都有自己的线程池,执行run()

我能想到的其他设计是,如果每个IO都需要池中不同数量的线程,或者与您的情况更相关的是,如果池无法共享,例如,如果您的网络IO可以取出每个线程并让你的串口IO等待。

答案 1 :(得分:7)

IIRC,在Michael Caisse's Boostcon ASIO talk期间(无论如何值得观看),我相信这个问题是由观众明确提出的,并且可以作为潜在的解决方案。我认为本身并没有错,并且可以根据您的设计以这种方式使用。

答案 2 :(得分:6)

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

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

  
    

我这里没有代码,但为什么要使用多个io_services?     我认为它使用了一个io_service和多个线程执行运行     那个io_service。

  
     

IIUC,每个io_service都拥有一个select / epoll /无论队列,因此拥有多个   io_services类似于拥有多个独立的select / epoll循环。在一些   情况,例如。大量的套接字和多个CPU,这可能有所帮助。

     

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