io_service,是什么以及如何使用它?

45

我正在尝试学习asio,并且正在跟随网站上的示例。

io_service是什么,为什么需要它,它具体做了什么?在执行异步操作时,为什么需要将它发送到几乎所有其他函数中,为什么不能在第一次“绑定”之后自行“创建”?

1个回答

63

Asio的io_service是异步函数操作的协调者。一旦异步操作准备就绪,它会使用io_service运行的线程来回调您。如果不存在这样的线程,则使用其自身的内部线程来回调您。

将其视为包含操作的队列。它保证当运行这些操作时,仅在调用其run()run_once()方法的线程上运行,或在处理套接字和异步IO时,在其内部线程上运行。

之所以必须将其传递给每个人,基本上是因为必须有人等待异步操作就绪,并且如其自身文档所述,io_service是ASIO与操作系统I / O服务的链接,因此它抽象出平台本身的异步通知程序,例如kqueue/ dev / pool /epoll,以及操作这些程序的方法,例如select()

主要我最终使用io_service来对系统的多个部分进行回调解复用,并确保它们在同一线程上运行,消除了显式锁定的需要,因为操作是串行化的。对于异步应用程序来说,这是一个非常强大的惯用语。

您可以查看核心文档,以更好地了解为什么需要io_service以及它的功能。


2
主要我最终使用io_service来对系统的多个部分进行回调解复用,并确保它们在同一线程上运行,(...)。您能否详细说明一下这个习语? - syntagma
1
你只需将操作提交到 io_service,当它们需要运行时,它会选择正确的线程并运行它,如果你使用 strand 来包装操作,则可能会串行化。 - Berkus
@Berkus 提出了一个很好的观点。io_service不提供回调函数的序列化,而strand则提供。 - jterm

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