Boost Asio和Co_await-与任何第三方回调一起使用

Boost ASIO and co_await- use with any third party callback?

本文关键字:回调 第三方 一起 任何 Asio Co await- Boost      更新时间:2023-10-16

一个简单的功能:

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)