【发布时间】:2021-02-14 13:54:54
【问题描述】:
我进入协同程序已经很晚了;但是现在 C++20 有了它们,可以这么说。具体来说,我观看了 Timur Doumler 在this CppCon20 talk 中关于协程的片段。
Timur 首先解释了协程与函数和协程(或者更确切地说,协程和相关的生成器)的使用:
my_generator<int> f() {
int i = 0;
while (true)
co_yield i++;
}
void foo() {
auto g = f();
std::cout << g() << '\n';
std::cout << g() << '\n';
std::cout << g() << '\n';
}
在后面的片段中,他介绍了co_await,并举了这个例子:
async_generator<T> f1() {
// code
auto u = co_await f2();
// more code
co_return u;
}
async_generator<U> f2() {
// code
co_yield u;
}
现在,我不明白的是,第二个示例与第一个示例中仅调用协程有何不同,例如:
async_generator<T> f1() {
auto g2 = f2();
// code
auto u = g2();
// more code
co_return u;
}
async_generator<U> f2() {
// code
co_yield u;
}
我尝试寻找co_await on cppreference,它确实存在,但是 - 它链接到一般的coroutines page - 老实说,我无法从树上看到森林。我宁愿不知道所有的细节——现在。我只是想了解高层次的概念差异。
【问题讨论】:
-
没有重新调用
f;调用它返回的生成器对应于执行co_await,但显然它的不同之处不仅在于它在每次协程执行时发生多次,而且还在于它不能挂起调用者。 -
@DavisHerring:“重新调用”只是一个比喻。不管怎样——调用一个函数; co_awaiting 一个协程;调用生成器 - 所有这些都会暂停调用者,直到返回某些内容。
标签: coroutine c++20 c++-coroutine