c++ - boost ASIO 和 co_await- 与任何第三方回调一起使用?

标签 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(例如 token )、Boost 的协程库和协程 TS 之间的关系是什么?

最佳答案

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

一旦您理解了协程 TS 需要什么才能工作,那么执行此操作可能并不费力。

你可以阅读 Lewis Baker articles关于合作例程TS。现在有很多人的很多视频和文章都涵盖了这个主题。一旦您理解了需求,支持其他等待类型就很简单了,只要您有某种方式在 co 例程完成时发出信号,并且您还有某种上下文来继续 co 例程完成。

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

实验 token 是 co routine TS 和 boost asio 之间的“胶水”代码(据我所知)。它与 Boost 的协程库无关。

Boost ASIO 支持 3 种协程类型:

关于c++ - boost ASIO 和 co_await- 与任何第三方回调一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946344/

相关文章:

c++ - 振奋 spirit : how to instruct the parser to read whole input and then report the result

c++ - 为什么在asio的示例中,tcp接受器模式使用shared_pointer模型包装堆套接字,而udp使用堆栈套接字?

c++ - Boost.Asio - 不执行所有处理程序

c++ - Boost Asio异步连接竞争条件?

c++ - 启动程序失败,错误代码为 1

c++ - 最常见的内存/资源泄漏错误

c++ - 使用 MSVC 14.0 (VS 2015) 编译 Boost 时编译器版本未知

c++ - 为什么在 Boost Turtle 中使用 MOCK_NON_CONST_METHOD_EXT 作为算子 float() ?

c++ - 在旧的 c++ (<c++11) 中,初始化结构会出错

c++ - 删除链接列表的项目时出现段错误