co_await运算符实际上是做什么的?

Cou*_*ero 7 c++ async-await c++-coroutine

我搜索了互联网,试图找到co_await操作员的工作,但我仍然不明白。我猜下面的代码:

co_await foo();
Run Code Online (Sandbox Code Playgroud)

暂停协程直到foo完成,但是在这种情况下,它不同于简单的调用,foo例如:

foo();
Run Code Online (Sandbox Code Playgroud)

这还将暂停当前功能,直到foo完成。请给我解释一下。

Evg*_*tov 12

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

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

在您的示例中,当您 write 时co_await foo(),只有在完成执行后您才会到达下一行foo,并且该行可能会在另一个线程中执行,但是 write foo(), 仅当foo()仅在同一线程中挂起时才会到达下一行,并且您赢了没有任何关于其完成的反馈。