多个ASIO io_services是一件好事吗?

20 c++ boost asynchronous network-programming boost-asio

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

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

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

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

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

Cub*_*bbi 16

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

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


Kaz*_*gon 7

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

  • 链接说它还没有准备好被观看..每个人都得到错误信息吗? (2认同)

Asi*_*san 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.循环是'共享'.我认为这对于处理程序是相对长时间运行的时候来说是最好的.