一个简单的函数:
awaitable<std::size_t> write(const std::vector<uint8_t>& data)
{
auto token = co_await this_coro::token();
return co_await async_write(serialport_, buffer(data), token);
}
可以等待使用co_await write(my_data)
.
当我使用任何异步 Boost ASIO 功能时,这有效。
如果异步函数是来自某个不相关库的回调,人们将如何使用这种模式?
该代码可能类似于:
awaitable<bar> foo()
{
auto token = co_await this_coro::token();
return co_await third_party_callback;
}
用法会是这样的auto result = co_await foo()
.
我很难弄清楚最简单/最干净的方法是什么。
附加问题:Boost ASIO 的协程 API(例如令牌)、Boost 的协程库和协程 TS 之间有什么关系?
要使用另一个库,另一个库必须创建对协程 TS 的支持,或者您(或其他人)必须在协程 TS 工作所需的内容和第 3 方库之间提供“粘合”代码。
一旦您了解协程 TS 需要什么才能工作,那么执行此操作可能并不需要花费太多精力。
你可以阅读刘易斯·贝克文章 https://lewissbaker.github.io/在 co 例程 TS 上。现在有很多人的很多视频和文章涵盖了这个主题。一旦您了解了需求,支持其他等待类型就很简单,只要您有某种方式在 co 例程完成时发出信号,并且您还有某种上下文来继续 co 例程完成。
如果第三方库只是做一些繁重的处理工作。您可能希望将工作包装到某种 boost future/promise 设置中,并使用已经存在的 boost 线程粘合代码,例如this one https://devblogs.microsoft.com/cppblog/using-c-coroutines-with-boost-c-libraries/(尽管 boost asio 示例早于 boost asio 实验支持。
实验令牌是 co 例程 TS 和 boost asio 之间的“粘合”代码(据我所知)。与Boost的协程库无关。
Boost ASIO 支持 3 种协程类型:
-
无堆栈协程 https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/overview/core/coroutine.html- 使用预处理器宏增强 ASIO 自己的轻量级 co 例程库(已经存在很长时间了)
-
堆栈协程 https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/overview/core/spawn.html- 使用Boost Coroutine库
-
协程 TS 支持(实验性) https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/overview/core/coroutines_ts.html- 使用 CO Routine TS(也是无堆栈的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)