【问题标题】:How can I call a coroutine from another coroutine in C++?如何在 C++ 中从另一个协程调用协程?
【发布时间】:2019-12-18 23:31:51
【问题描述】:

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

我正在使用#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() 根本不会被执行。

【问题讨论】:

  • 不清楚suspend_alwaysresumable 的目的是什么。
  • @NicolBolas suspend_alwaysstd::experimental::suspend_alwaysresumable 来自这里:blog.panicsoftware.com/your-first-coroutine
  • 这并不能解释你试图通过使用它们来实现什么。为什么最后这些函数co_await suspend_always()?为什么他们返回resumable 并使用随附的承诺类型?为什么要丢弃 part1part2 函数返回的 resumable?你说你希望这些函数表现得像一个协程,但我在这里看不到任何表现得像协程的东西。
  • 我有一个函数,例如。一分钟完成 (main_coroutine())。我不希望它阻止程序其余部分的执行。它由许多较小的部分组成,例如每个需要 1 秒 (part1_coroutine)。如果那些阻止执行也没关系。我可以做一个线程。但我宁愿使用协程,因为它会使与主程序的通信更容易。我以前在 Unity 和 C# 中使用过协程,这是我经常做的事情。也许我把我的例子简化得太多了,但我不想让它看起来太复杂。
  • 如果您向我们展示您正在尝试编写的代码的“长协程”版本是什么,那将非常有帮助。就像,拿上面的代码,写它的长格式版本。

标签: c++ visual-studio-2019 c++20 c++-coroutine


【解决方案1】:

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

【讨论】:

  • 我明白了。但我仍然不明白,因为如果我尝试执行co_await part1_coroutine();,我会收到错误“找不到类型'resumable'的可调用'await_resume'函数”。这是可以理解的,因为据我所知,co_await 之后应该有一个 Awaiter 对象,而不是协程调用或任何正确的术语。我不认为 Awaiter 是一回事,因为对 Awaiter 的要求是它具有 await_readyawait_suspendawait_resume 的功能,我不太明白它们与协程调用自身。
  • @kynnysmatto:这似乎是您所遵循示例的限制:它还不足以支持嵌套协程。
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 2021-12-28
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2013-07-19
相关资源
最近更新 更多