我的应用程序使用 boost.asio 来运行产生(协程)的网络相关任务。
在某些情况下,当我的任务是从另一个生成的任务生成时,它会直接从当前任务的调用堆栈中调用。
我希望它会排队并可能在当前任务挂起后运行(如果没有其他任务在同一 io_context 上挂起)
查看生成代码,它到达
boost::asio::dispatch
,触发异步操作
return async_initiate<NullaryToken, void()>(
detail::initiate_dispatch(), token);
所以我的任务是直接调用的,而不是从某个调度程序调用的,这似乎很奇怪,这可能吗?
谢谢
asio::dispatch
记录在执行器上进行分派。
执行者概念将
dispatch
的行为记录为:
效果:在当前执行线程中创建一个用
(C++Std [DECAY_COPY(forward<Func>(f))
]) 初始化的对象 f1 。最多调用thread.decaycopy
一次。 执行器可能会阻止调用者的前进进度,直到f1()
完成执行。f1()
(强调我的)。
将此与
dispatch
或 defer
对比:
执行者不得在等待完成
之前阻止调用者的前进进度f1()
简单地说:
dispatch
可以立即执行处理程序,但前提是当前执行的执行器实现了此优化并且与关联的执行器兼容。
另请参阅背景/示例: