运维开发网

C语言 co_await操作符实际上做了什么?

运维开发网 https://www.qedev.com 2020-03-09 16:56 出处:网络 作者:运维开发网整理
我在网上试图找到co_await操作符做了什么,但我仍然无法理解.我想以下代码: co_await foo(); 暂停协程直到foo完成,但在这种情况下它与简单地调用foo的区别如下: foo(); 这也将暂停当前函数,直到foo完成.请解释一下. 简而言之 如果函数包含至少一个co_await运算符,则整个函数将转换为协程.它的所有范围变量,包括参数都存储在堆上,而不是堆栈.这使得可以在不丢失状
我在网上试图找到co_await操作符做了什么,但我仍然无法理解.我想以下代码:

co_await foo();

暂停协程直到foo完成,但在这种情况下它与简单地调用foo的区别如下:

foo();

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

简而言之

如果函数包含至少一个co_await运算符,则整个函数将转换为协程.它的所有范围变量,包括参数都存储在堆上,而不是堆栈.这使得可以在不丢失状态的情况下暂停功能,并在需要时恢复.函数(协同程序)也会在第一个暂停时返回给调用者,并在第一个“返回值”语句中完成.因为它返回未完成,返回类型必须来自“awaitable types”系列,例如std :: future(c允许你创建自己的等待类型 – 它真棒!),因此调用者可以在函数完成时订阅/ co_await .

重要的是要注意:

暂停的功能可以随时恢复和完成,任何线程都取决于实现.

在您的示例中,当您编写“co_await Foo()”时,只有在Foo()完成后才会到达下一行,并且此行可能在另一个线程中执行,但写入“Foo()”将会到达当Foo()仅在同一个线程中挂起时,下一行,你将不会有任何关于Foo()完成的反馈.

0

精彩评论

暂无评论...
验证码 换一张
取 消