2016-11-06 132 views
0

我正在阅读关于Asio的一些答案,并且在SO中的示例和here中引人注目的模式是使用单个io_service并在可以通过套接字处理打开,发送和接收消息的工作人员之间共享。在多个线程上使用单个io_service有什么好处?

在多个套接字抽象之间共享io_service是否有任何好处?为什么不让每个人都拥有自己的io_service?

+0

资源。你应该尝试找到现有的答案,因为它经常被问到 – sehe

+0

我通常使用的模式是对所有关键工作都有一个主要的io_service,它有多个线程分派。还有一个用于后台的辅助io_service(管理任务/套接字等),通常由单个线程处理。这种分离使我能够控制例如事情发生的地方 - 并且对非关键活动进行优先排序......但它取决于你的情况。 – Nim

回答

1

据我了解,io_service“拥有”资源。如果您有一个io_service处理所有asio函数,那么您可以管理优先级。如果你有多个io_service实例,所有“拥有”相同的资源,那么它们会发生冲突。

+0

这不是真的那样。例如。如果你有一个套接字,这个套接字不是由'io_service'永久拥有的。您可以自由使用一个'io_service'来写数据,另一个来读数据。或者通过多个io_services执行连续的异步读取。基本上等于将套接字从一个io_service移动到另一个。你不应该做的事情是通过多个io_services在资源上进行并发操作。 – Matthias247

0

我尝试过这种模式,并不建议您再使用它只期望一些非常特定的场景。相反,如果您需要,我建议“始终只使用一个套接字io_service”方法,并使用多个io_services(每个都在专用线程中运行)。

原因是,如果您从多个线程使用一个io_service,则可以从任何参与线程调用所有回调(完成处理程序),并且必须为它们提供其他同步。在“资源属于一个正在一个线程上执行的io_service”模型中,您不需要这样做,因为没有并发处理程序将从另一个线程执行。

相关问题