繁体   English   中英

Boost::Asio 和 C++20 协程有什么关系?

[英]What is the relationship between Boost::Asio and C++20 coroutines?

我开始尝试通过阅读 文档和示例代码来学习 Boost::Asio。 我发现事情很难理解,特别是因为模型看起来类似于协程。

然后我决定从这个cppcon talk开始学习协程。 在链接的演讲中,在协程使用示例中给出了以下行。 该示例是在 2014 年编写的,因此语法可能与 C++20 协程不匹配。

auto conn = await Tcp::connect.Read("127.0.0.1", 1337)

这感觉类似于 Boost::Asio 的既定目标。 但是,在 Boost::Asio 文档的示例部分,有一个混合了 Boost::Asio 和 C++20 协程的示例。 (我还不明白这个例子。)

Boost::Asio 和协程有什么关系? 协程会替换 Boost::Asio 的一部分吗? 如果我不做网络,我还应该使用 Boost::Asio 吗? std::asyncsenders/receivers提案在哪里适合所有这些?

Q. Boost::Asio 和协程有什么关系?

C++20 协程是任何符合 Asio 的异步 API 提供的完成令牌机制之一

:协程会替代 Boost::Asio 的一部分吗?

不是1对1。

在实践中,人们可能觉得编写asio::spawn (stackful) 协程的需要少了很多,因为在实践中很少需要堆叠性,并且相比之下使实现(非常)繁重。 此外,直到 Boost 1.81(?) asio::spawn仍将依赖于 Boost Coroutine(正在努力删除它并直接在 Boost Context 之上实现该功能)。

C++20 协程似乎可以消除摩擦的另一个地方是提供双重 API(同步和异步)。 我听说有人建议可以透明地实现异步版本的同步版本。 我不了解这种模式的细节(以及它是否已经准备好用于生产代码)。

:如果我不做网络,我还应该使用 Boost::Asio 吗?

应该? 不,但你可以。 一般来说,对于 c++20 协程,您将需要使用一些库,如cppcoro或确实是 Asio。 那是因为还没有标准化的用户级图书馆设施。

在 Asio 中,有趣的部分是:

  1. 通道( channelconcurrent_channel通道)、parallel_group、wait_for_{all,one,any} 等实验性内容

  2. 具有很大灵活性的通用设施coro 您可以将其视为 cppcoro 中最有用的 80%,但

    • 全部在一个相对简单的类模板中:

      1. coro<T> -> 简单的生成器
      2. coro<T(U)> -> 带输入的生成器
      3. coro<void, T>任务产生T
    • 与 Asio 执行器集成

文档是一个相当不错的介绍¹,尤其是当您熟悉其他库/语言的概念时。

:std::async 和 senders/receivers 提案在哪里适合所有这些?

我不确定。 我似乎记得 Chris Kohlhoff 写了那个提议。 这个概念可能已经潜伏在 Asio 的channel / deferred抽象之下。


¹ 帽子提示@klemensmorgenstern

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM