【问题标题】:What does co_await operator actually do?co_await 运算符实际上是做什么的?
【发布时间】:2018-11-29 23:08:34
【问题描述】:

我在网上搜索了co_await 运算符是做什么的,但我仍然无法理解。我猜是下面的代码:

co_await foo();

暂停协程直到 foo 完成,但在这种情况下,它与简单地调用 foo 有何不同,例如:

foo();

这也将暂停当前函数,直到foo 完成。请解释一下。

【问题讨论】:

  • 你读过this吗?
  • 谢谢!这篇文章对我来说很难理解。 :( 你能用更简单的方式解释一下这个概念吗?

标签: c++ async-await c++-coroutine


【解决方案1】:

如果函数包含至少一个co_await 运算符,则整个函数被认为是一个协程。它的所有作用域变量(包括参数)都存储在堆上,而不是堆栈上。这使得可以在不丢失其状态的情况下暂停函数执行并在需要时恢复。此外,协程在第一次挂起时将控制权返回给调用者,并在第一个 return 语句上完成。由于它返回未完成,因此返回类型必须是“等待类型”,例如std::future<int>。 (C++ 允许您创建自己的可等待类型 - 这太棒了!)调用者可以在函数完成时订阅/co_await

需要注意的是,被挂起的函数可以在任何时间和任何线程上恢复和完成;细节取决于实现。

在您的示例中,当您编写 co_await foo() 时,只有在 foo 完成执行后才能进入下一行,并且此行可能在另一个线程中执行,但是编写 foo() 将进入下一行当foo() 只被挂起在同一个线程中时,你不会有任何关于它完成的反馈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2011-03-11
    • 2010-11-26
    • 2015-06-23
    • 2017-12-26
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多