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

时间:2018-06-20 18:11:35

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

我已经在Internet上进行搜索,试图找到co_await运算符的作用,但我仍然无法理解。我猜下面的代码:

co_await foo();

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

foo();

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

1 个答案:

答案 0 :(得分:2)

简而言之

如果函数包含至少一个co_await运算符,则整个函数将转换为协程。它的所有作用域变量(包括参数)都存储在堆中,而不是堆栈中。这样就可以在不失去其状态的情况下挂起功能,并在需要时恢复。同样,函数(协程)在第一次挂起时返回到调用方,并在第一个“返回值”语句上完成。由于返回未完成,因此返回类型必须来自“等待类型”族,例如std :: future(c ++允许您创建自己的等待类型-太棒了!),因此调用者可以在函数完成时订阅/ co_await

重要说明: 挂起的功能可能会在任何时间和任何线程中恢复并完成,具体取决于实现方式。

在您的示例中,当您编写“ co_await Foo()”时,只有在Foo()完成后才能进入下一行,并且该行可以在另一个线程中执行,但是编写“ Foo()”将当Foo()仅暂停在同一线程中时,转到下一行,并且您将不会收到有关Foo()完成的任何反馈。