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

5
我开始尝试通过阅读文档和示例代码来学习Boost::Asio。我发现很难理解,特别是因为模型似乎类似于协程。
然后,我决定学习协程,从这个cppcon演讲开始。在链接的演讲中,给出了以下一行作为协程使用示例。该示例是在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 :: async发送器/接收器提案在这一切中扮演着什么角色?
1个回答

6

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

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

Q. 协程是否替代了Boost::Asio的某些部分?

不是一对一的关系。

实际上,在实践中,人们可能感到很少需要编写(堆栈式)协程 asio::spawn,因为实际上很少需要使用堆栈性质,并且相比之下使实现更加复杂。此外,在Boost 1.81(?)之前,asio::spawn仍将依赖于Boost Coroutine(正在进行工作,以删除其并直接在Boost Context之上实现该功能)。

C++20协程似乎消除了提供双重API(同步和异步)时的摩擦。听说可以透明地使用异步版本来实现同步版本。我还没有掌握此模式的具体细节(以及它是否准备好用于生产代码)。

Q. 如果我不进行网络操作,是否仍应使用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和发送者/接收者提案在这一切中的作用是什么?

我不确定,好像Chris Kohlhoff写了那个提案。这个概念可能已经潜藏在Asio的channel/deferred抽象之下了。

¹感谢@klemensmorgenstern提示

删除了我的先前评论。用谷歌搜索回答了我的后续问题。 - Mark Wallace
1
Boost Asio引入了统一完成令牌。这也被提议用于标准化。 "Asio compliant"是我松散使用的非正式术语,意思是“符合统一完成令牌模型的API”。 - sehe
你说:“这是因为尚未标准化任何用户级库设施。”我不确定你的意思。你是指“没有网络用户级库设施”还是“没有异步I/O用户级库设施”,还是其他什么?承诺这次不会删除这个评论。 - Mark Wallace
2
我指的是C++协程的用户级(库)功能。 (哈哈:))只有语言特性已经完成,故意非常通用,因此非常难以使用(TM) - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接