【问题标题】:Boost ASIO and co_await- use with any third party callback?Boost ASIO 和 co_await - 与任何第三方回调一起使用?
【发布时间】:2019-07-23 14:06:02
【问题描述】:

一个简单的函数:

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 的协程库和 Coroutines TS 之间有什么关系?

【问题讨论】:

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


    【解决方案1】:

    要使用另一个库,另一个库必须创建对协同程序 TS 的支持,或者您(或其他人)必须在协同程序 TS 工作所需的内容和第 3 方库之间提供“胶水”代码。

    一旦您了解协程 TS 需要什么来工作,那么做这件事的努力可能并不多。

    你可以在 coroutines TS 上阅读Lewis Baker articles。现在有很多人的很多视频和文章都在讨论这个话题。一旦你理解了这些需求,支持其他 await 类型就很简单了,只要你有一些方法可以在 co 例程完成时发出信号,并且你还有某种上下文来继续 co 例程完成。

    如果第三方库只是做一些繁重的处理工作。您可能希望将工作包装到某种 boost future / promise 设置中,并使用已经存在的 boost 线程粘合代码,例如 this one(尽管 boost asio 示例早于 boost asio 实验性支持。

    实验性令牌是协程 TS 和 boost asio 之间的“粘合”代码(据我所知)。和 Boost 的协程库无关。

    Boost ASIO 支持 3 种协程类型:

    【讨论】:

    • 我认为文章的链接已损坏。
    • 我已经修复了 Lewis Baker 断开的链接。
    猜你喜欢
    • 2021-04-23
    • 2012-10-01
    • 2021-05-06
    • 2018-08-28
    • 1970-01-01
    • 2023-04-07
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多