我在 Internet 上进行了搜索,试图找到 co_await
运算符的作用,但我仍然无法理解。我猜是下面的代码:
co_await foo();
暂停协程直到 foo
完成,但在这种情况下它与简单地调用 foo
有何不同:
foo();
这也会挂起当前函数,直到 foo
完成。请解释一下。
最佳答案
如果函数至少包含一个co_await
运算符,整个函数被认为是协程。它的所有范围变量(包括参数)都存储在堆上,而不是堆栈上。这使得暂停函数执行而不丢失其状态并在需要时恢复成为可能。此外,协程在第一次挂起时将控制权返回给调用者,并在第一次 return
时完成。陈述。由于它返回未完成,因此返回类型必须是“等待类型”,例如 std::future<int>
. (C++ 允许您创建自己的可等待类型 - 这太棒了!)调用者可以订阅/co_await
关于功能完成。
重要的是要注意暂停的功能可能会在任何时间和任何线程上恢复和完成;细节取决于实现。
在您的示例中,当您编写 co_await foo()
时,您将仅在 foo
之后到达下一行已完成执行,此行可能会在另一个线程中执行,但是写入 foo()
, 将在 foo()
时进入下一行仅在同一个线程中挂起,您不会收到有关其完成的任何反馈。
关于c++ - co_await 运算符实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50954609/