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

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

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

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案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 不提供回调的序列化。股确实
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2016-09-17
    • 2022-01-10
    • 2015-03-13
    相关资源
    最近更新 更多