提升asio io_service dispatch vs post

时间:2010-02-24 14:17:39

标签: c++ boost boost-asio

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

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

2 个答案:

答案 0 :(得分:34)

嗯,这取决于调用的上下文,即它是从io_service中运行还是没有:

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

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

这意味着什么:

... dispatch最终可能会再次调用您的代码(当然,这取决于您的应用以及如何将呼叫链接起来),但一般来说,您应该确保您的回调是重新进入的如果您使用dispatch

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

<强>更新

要从@gimpf删除的答案中加入一些,一个较旧的boost版本有这个dispatch实现(我的评论):

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
}

答案 1 :(得分:10)

请参阅此博客文章:
To post or to dispatch? - This Thread

  

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