一个简单的功能:
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的Coroutines API(例如令牌),Boost的Coroutines库和Coroutines TS?
要使用另一个库,另一个库必须为Coroutines TS创建支持,或者您(或其他人)必须在Coroutines TS所需的内容之间提供"胶水"代码上班和第三方图书馆。
一旦您了解Coroutines TS需要什么,就可以做到这一点。
您可以在CO例程中阅读Lewis Baker文章。现在有很多人介绍该主题的视频和文章。一旦您了解了要求,只要您有某种方式可以发出信号,那么支持其他等待类型就很简单了
如果第三方库只是进行一些重大处理工作。您可能想将工作包裹为某种增强的未来/承诺设置,并使用已经存在的Boost线胶代码(尽管Boost ASIO示例早于Boost ASIO ASIO实验支持。
。实验令牌是CO例程TS和Boost Asio之间的"胶水"代码(据我所知)。它与Boost的Coroutine库无关。
Boost Asio支持3种CO例程类型:
- 无固定的Coroutines-使用预处理器宏(现在已经存在很长时间) boost asio asio asio自己的轻巧co常规库
- 堆叠式Coroutines-使用Boost Coroutine Library
- Coroutines TS支持(实验) - 使用CO常规TS(也是无stack)