代码之家  ›  专栏  ›  技术社区  ›  coelhudo

提高asio io_服务调度vs post

  •  30
  • coelhudo  · 技术社区  · 15 年前

    有人能告诉我IO服务的区别吗 dispatch post ?我不清楚什么更适合我的问题。

    我需要在另一个处理程序中调用一个处理程序,我不知道 调用程序 使用。

    2 回复  |  直到 7 年前
        1
  •  33
  •   Macke    7 年前

    嗯,这取决于调用的上下文,也就是说,它是从IO服务内部运行还是不运行:

    • post 不会直接调用函数,但会推迟调用。
    • dispatch 如果调度调用者是从IO服务本身调用的,将立即调用它,否则将其排队。

    因此,它取决于调用post/dispatch的函数,以及给定的处理程序是否可以直接调用。

    这意味着:

    …那是 派遣 最终可能会再次调用您的代码(当然,这取决于您的应用程序以及如何链接调用),但一般来说,您应该 如果您使用 派遣 .

    派遣 因此速度更快,因为它可以避免在可能的情况下排队。它附带了一些注意事项,因此您可能需要使用 邮递 偶尔,或者总是(如果你想安全地玩,并且能负担得起的话)。

    更新

    为了将@gimpf删除的答案中的一些内容合并起来,一个较旧的boost版本实现了调度(我的评论):

    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
    }
    
        2
  •  10
  •   Akira Takahashi    10 年前

    查看此日志:
    To post or to dispatch? - This Thread

    运行应用程序,我们将看到过账和 调度。因为它可以这样做,所以dispatch()将执行fb()。 直接运行,因此我们将看到它在当前线程中运行,并且 同步。另一方面,post()会要求IO服务执行 作业在另一个线程中异步返回 调用方的控件。