一个简单的功能:
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之间是什么关系?
答案 0 :(得分:1)
要使用另一个库,另一个库必须为协程TS创建支持,或者您(或其他人)必须在协程TS所需工作的内容和第三方库之间提供“胶水”代码。
一旦了解了协程TS的工作原理,可能无需花太多精力。
您可以在协同例程TS上阅读Lewis Baker articles。现在有很多人都在谈论这个话题的视频和文章。一旦了解了需求,支持其他等待类型就很简单,只要您有某种方法可以在协同例程完成时发出信号,并且您还有某种上下文可以继续协同例程完成。
如果第三方库只是做一些繁重的处理工作。您可能希望将工作包装到某种类型的Boost Future / Promise设置中,并使用this one之类已经存在的Boost线程粘合代码(尽管boost asio示例早于boost asio实验支持。
实验性标记是协例行程序TS和boost asio之间的“胶水”代码(据我所知)。它与Boost的协程库无关。
Boost ASIO支持3种协同例程类型: