提升ASIO和co_await-与任何第三方回调一起使用吗?

时间:2019-03-01 14:10:14

标签: c++ boost boost-asio coroutine boost-coroutine

一个简单的功能:

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之间是什么关系?

1 个答案:

答案 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种协同例程类型: