io_service,为啥以及如何使用它?

Posted

技术标签:

【中文标题】io_service,为啥以及如何使用它?【英文标题】:io_service, why and how is it used?io_service,为什么以及如何使用它? 【发布时间】:2010-10-17 13:32:07 【问题描述】:

正在尝试学习 asio,我正在关注网站上的示例。

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

【问题讨论】:

【参考方案1】:

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

把它想象成一个包含操作的队列。它保证这些操作在运行时只会在调用其 run()run_once() 方法的线程上执行,或者在处理套接字和异步 IO 时,即其内部线程。

您必须将它传递给每个人的原因基本上是有人必须等待异步操作准备好,并且如其自己的文档中所述 io_service 是 ASIO 与操作系统 I/O 服务的链接,因此它抽象了平台自带的异步通知器,如kqueue/dev/pool/epoll,以及对它们进行操作的方法,如select()

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

您可以查看core documentation 以更好地了解为什么需要io_service 以及它的作用。

【讨论】:

Primarily I end up using io_service to demultiplex callbacks from several parts of the system, and make sure they operate on the same thread,(...) 你能详细说明一下这个成语吗? @ΔλЛ 您只需将操作发布到 io_service ,当它们运行时,它会选择正确的线程并运行它,如果您使用链来包装操作,可能会被序列化。 @Berkus 提出了一个很好的观点。 io_service 不提供回调的序列化。股确实

以上是关于io_service,为啥以及如何使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 boost::asio::tcp::io_stream 附加到我的 io_service?

构建错误:[NSManagedObjectContext *localContext] - 为啥以及如何修复它?

为啥我需要静态修饰符以及如何修复它?

分配后列表意外更改,这是为啥以及如何防止它?

TensorFlow:如何以及为啥要使用 SavedModel

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?