我从上下文线程(与 boost 上下文关联的事件循环线程)调用 async_write 。为了使我的代码正确运行,仅在 async_write 返回后调用完成处理程序(有或没有错误)非常重要。
根据文档:
如果异步操作立即完成(即在调用启动函数的执行线程内,且在启动函数返回之前),则应提交完成处理程序以执行,就像执行 ex2.post(std::move( f)、分配2)。否则,完成处理程序应提交执行,就像执行 ex2.dispatch(std::move(f), alloc2) 一样。
但是,我还不清楚是否可以在 async_write 返回之前调用完成处理程序,因为我找不到 post 和调度之间的区别。
Post 永远不会立即调用处理程序。
如果允许,Dispatch 可能会立即调用处理程序(执行器与正在运行的线程匹配)。
做出区分是为了维护排序保证,包括异步操作中涉及的分配(取消)分配的顺序。
TL;DR 您的要求已经由所有 Asio 异步启动函数保证了。
Asio 1.27.0 (Boost 1.83) 添加了在操作立即完成时自定义完成处理程序执行的功能。。这意味着,如果您坚持相反的行为,您现在可以:自定义立即完成。该文档页面也可能会加深您对默认行为的理解。