答案 0 :(得分:34)
嗯,这取决于调用的上下文,即它是从io_service中运行还是没有:
post
不会直接调用该函数,而是推迟调用。 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这样做 该作业,在另一个线程中异步,并立即返回 对来电者的控制。