在Asio中,是否可以在调用线程返回之前调用async_XX操作的完成处理程序

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

我从上下文线程(与 boost 上下文关联的事件循环线程)调用 async_write 。为了使我的代码正确运行,仅在 async_write 返回后调用完成处理程序(有或没有错误)非常重要。

根据文档:

如果异步操作立即完成(即在调用启动函数的执行线程内,且在启动函数返回之前),则应提交完成处理程序以执行,就像执行 ex2.post(std::move( f)、分配2)。否则,完成处理程序应提交执行,就像执行 ex2.dispatch(std::move(f), alloc2) 一样。

但是,我还不清楚是否可以在 async_write 返回之前调用完成处理程序,因为我找不到 post 和调度之间的区别。

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

Post 永远不会立即调用处理程序。

如果允许,Dispatch 可能会立即调用处理程序(执行器与正在运行的线程匹配)。

做出区分是为了维护排序保证,包括异步操作中涉及的分配(取消)分配的顺序。

TL;DR 您的要求已经由所有 Asio 异步启动函数保证了。

边注:

Asio 1.27.0 (Boost 1.83) 添加了在操作立即完成时自定义完成处理程序执行的功能。。这意味着,如果您坚持相反的行为,您现在可以:自定义立即完成。该文档页面也可能会加深您对默认行为的理解。

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