提升asio io_service dispatch vs post

coe*_*udo 31 c++ boost boost-asio

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

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

Mac*_*cke 36

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

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

因此,它取决于调用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
}
Run Code Online (Sandbox Code Playgroud)

  • @IgorGanapolsky:直接*直接*我的意思是作为'post()'召唤的后代.相反,它会被间接调用,因为你调用poll()或类似的顶循环方法来检查是否有任何工作要做(调用调用,已过期的定时器或套接字上的新数据等) ). (2认同)

Aki*_*shi 10

看到这篇博客文章:
发布或发送? - 这个线程

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