boost.asio 直接从当前堆栈生成调用处理程序

问题描述 投票:0回答:1

我的应用程序使用 boost.asio 来运行产生(协程)的网络相关任务。

在某些情况下,当我的任务是从另一个生成的任务生成时,它会直接从当前任务的调用堆栈中调用。

我希望它会排队并可能在当前任务挂起后运行(如果没有其他任务在同一 io_context 上挂起)

查看生成代码,它到达

boost::asio::dispatch
,触发异步操作

  return async_initiate<NullaryToken, void()>(
      detail::initiate_dispatch(), token);

所以我的任务是直接调用的,而不是从某个调度程序调用的,这似乎很奇怪,这可能吗?

谢谢

c++ boost boost-asio boost-coroutine
1个回答
0
投票

asio::dispatch
记录在执行器上进行分派。

执行者概念将

dispatch
的行为记录为:

效果:在当前执行线程中创建一个用

DECAY_COPY(forward<Func>(f))
(C++Std [
thread.decaycopy
]
) 初始化的对象 f1 。最多调用
f1()
一次。 执行器可能会阻止调用者的前进进度,直到
f1()
完成执行

强调我的)。

将此与

dispatch
defer
对比:

执行者不得在等待完成

f1()

之前阻止调用者的前进进度

简单地说:

dispatch
可以立即执行处理程序,但前提是当前执行的执行器实现了此优化并且与关联的执行器兼容。

另请参阅背景/示例:

© www.soinside.com 2019 - 2024. All rights reserved.