关于“asio::async_compose”与“asio::async_initiate”的混淆

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

我正在慢慢理解 asio 做事的方式,因为我迁移遗留回调代码以使用完成令牌。到目前为止,我一直在遵循使用

callback_wrapper.cpp
asio::asio::async_initiate
示例中描述的模式。然后我正在阅读文章“The great mystery on how to make durable, asynchronous functions for asio.”,作者使用了
asio::async_compose
。一个比另一个有优势吗? API 看起来很相似,除了一个接受通用参数,另一个接受 io 上下文和执行器,通过包装函数提供参数。能够通过 lambda 捕获实现双向数据流与通过参数实现单向数据流之间只是区别吗?

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

对asio也是新手,但在阅读了官方编写的xx示例(https://www.boost.org/doc/libs/1_81_0/doc/html/boost_asio/examples/cpp20_examples.html)后,我认为区别出现当你需要组合多个异步操作(例如,等待某个定时器,然后通过套接字发送消息)。

如果您使用 async_initiate,则需要通过结构或 lambda 或其他方式创建中间完成处理程序,例如 composed_5.cppcomposed_6.cpp 中的 intermediate_completion_handler。 中间处理程序被传递给中间启动函数,如定时器的 async_wait。

但是,如果您使用async_compose,您可以通过将异步操作实现(async_compose的第一个参数)传递给中间启动函数来省略它。 async_compose 负责生成中间完成处理程序,如示例中的评论所述:

我们的 lambda 的第一个参数是对封闭的引用 中间完成处理程序。这个中间完成处理程序 由 boost::asio::async_compose 函数为我们提供,并且 负责实施符合要求的所有细节 异步操作。调用底层异步时 操作,我们将这个封闭的中间完成处理程序传递给它 作为完成标记。

所以如果你只是想包装一些一次性回调接口,两者都可以,但如果你想将多个操作合并为一个,async_compose 可能是更好的选择。

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