【发布时间】:2011-01-20 13:26:47
【问题描述】:
【问题讨论】:
标签: c++ boost boost-asio
【问题讨论】:
标签: c++ boost boost-asio
嗯,这取决于调用的上下文,即它是从 io_service 内部运行还是不运行:
post 永远不会直接调用该函数,而是推迟调用。 dispatch 如果从 io_service 本身调用 dispatch-caller 将立即调用它,否则将其排队。 所以,这取决于调用 post/dispatch 的函数,以及是否可以立即调用给定的处理程序。
这是什么意思:
...是dispatch 最终可能会再次调用您的代码(当然,这取决于您的应用程序以及您如何链接调用),但通常您应该确保您的回调是可重入的使用dispatch。
dispatch 因此更快,因为它尽可能避免排队呼叫。它带有一些注意事项,因此您可能需要偶尔或始终使用post(如果您想安全地使用它并且负担得起的话)。
更新
为了合并@gimpf 的已删除答案中的一些内容,较旧的 boost 版本具有这种调度实现(我的 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
}
【讨论】:
查看此博客条目:
To post or to dispatch? - This Thread
运行应用程序,我们将看到发布和发布之间的区别 调度。因为它可以做到,所以 dispatch() 会执行 fB() 直接,所以我们会看到它在当前线程中运行,并且 同步。另一方面, post() 会要求 io_service 做 作业,在另一个线程中异步,它立即返回 控制权交给调用者。
【讨论】: