c++ - co_await 运算符实际上做了什么?

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

我在 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/

相关文章:

c++ - 连接到主机错误

c++ - 如何获取SDL_CreateWindow定义

c# - 在没有 COM 的情况下从非托管 C++ 应用程序调用 C# dll

c++ - "With a stackless coroutine, only the top-level routine may be suspended."是什么意思

c++ - C++ 20协程的Lambda生命周期说明

c++ - 处理输入流运算符中的无效输入>>

c# - 只要使用异步,ASP.Net MVC 4 Controller 就会挂起

c# - 使用 Async 和 Await 中断数据库调用(使用 Dapper)

c# - 如何更改任务中的值

c++ - 为什么 coroutine_handle.done 无法返回正确的结果?