如何在C++中从另一个协程调用协程?

How can I call a coroutine from another coroutine in C++?

本文关键字:程调用 调用 另一个 C++      更新时间:2023-10-16

我有一个很长的协程,我想把它分成更小的协程。就像常规函数一样,使代码更清晰。它的行为应该就像只有一个大的协程,所有较小的协程连续发生一样。

我正在使用#include <experimental/coroutine>.

我一直在尝试这样的事情:

resumable part1_coroutine()
{
cout << "1" << endl;
co_await suspend_always();
}
resumable part2_coroutine()
{
cout << "2" << endl;
co_await suspend_always();
}
resumable main_coroutine()
{
cout << "main" << endl;
part1_coroutine();
part2_coroutine();
co_await suspend_always();
}

但似乎发生的事情是,part1_coroutine()part2_coroutine()根本不会被执行。

这就是co_await foo()的作用- 给另一个协程foo一个取得进展的机会,根据需要暂停当前协程以等待它完成。 如果您只是调用协程但不等待它,则会丢弃对该项程的调用句柄,从而放弃调用。

令人惊讶的是,协程是不可行的。如标准中所述,协程只能通过与 awaitable(co_awaiting它们(交互来挂起。为了从另一个协程调用一个协程,必须将其设置为可等待的协程。因此,您必须在协程返回的对象上实现可等待的 API。因此,需要建造相当多的管道才能完成这项工作。