【问题标题】:Boost asio io_service dispatch vs post提升 asio io_service 调度与发布
【发布时间】:2011-01-20 13:26:47
【问题描述】:

谁能告诉我 io_service dispatchpost 之间的区别?我不清楚什么更适合我的问题。

我需要在另一个处理程序中调用一个处理程序,但我不知道要使用什么 invoker

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    嗯,这取决于调用的上下文,即它是从 io_service 内部运行还是不运行:

    • post 永远不会直接调用该函数,而是推迟调用。
    • dispatch 如果从 io_service 本身调用 dispatch-caller 将立即调用它,否则将其排队。

    所以,这取决于调用 post/dispatch 的函数,以及是否可以立即调用给定的处理程序。

    这是什么意思:

    ...是dispatch 最终可能会再次调用您的代码(当然,这取决于您的应用程序以及您如何链接调用),但通常您应该确保您的回调是可重入的使用dispatch

    dispatch 因此更快,因为它尽可能避免排队呼叫。它带有一些注意事项,因此您可能需要偶尔或始终使用post(如果您想安全地使用它并且负担得起的话)。

    更新

    为了合并@gimpf 的已删除答案中的一些内容,较旧的 bo​​ost 版本具有这种调度实现(我的 cmets):

    template <typename Handler>
    void dispatch(Handler handler)
    {
      if (call_stack<win_iocp_io_service>::contains(this)) // called from within io_service?
        boost_asio_handler_invoke_helpers::invoke(handler, &handler); // invoke rightaway
      else
        post(handler); // queue
    }
    

    【讨论】:

    • 你说的~"是什么意思永远不会直接调用函数?那么函数将如何被调用。
    • @IgorGanapolsky:直接我的意思是作为“post()”电话的后代。相反,由于您调用 poll() 或类似的顶部循环方法来检查是否有任何工作要做(要调度的调用、已过期的计时器或套接字上的新数据等),它将被间接调用)。
    【解决方案2】:

    查看此博客条目:
    To post or to dispatch? - This Thread

    运行应用程序,我们将看到发布和发布之间的区别 调度。因为它可以做到,所以 dispatch() 会执行 fB() 直接,所以我们会看到它在当前线程中运行,并且 同步。另一方面, post() 会要求 io_service 做 作业,在另一个线程中异步,它立即返回 控制权交给调用者。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2012-04-04
      • 1970-01-01
      • 2018-06-13
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多