在多个线程上使用单个 io_service 有什么好处?

Whats the benefit of using a single io_service over multiple threads?

我正在阅读一些关于 Asio 的答案,在示例和 SO 中的 here 中,一个突出的模式是使用单个 io_service 并在工作人员之间共享它将处理通过套接字打开、发送和接收消息。

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

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

我尝试过该模式,但不建议您再使用它,希望仅在某些非常特定的情况下使用。相反,我推荐 "use a socket always only from a single io_service" 方法,并在需要时使用多个 io_services(每个 运行 在专用线程中)。

这样做的原因是,如果您从多个线程使用一个 io_service,则可以从任何参与线程调用所有回调(完成处理程序),并且您必须为它们提供额外的同步。在 "resource belongs to one io_service which is executing on one thread" 模型中你不需要这个,因为不会从另一个线程执行并发处理程序。