【问题标题】:Is there a good real world example for coroutines有没有一个很好的协同程序现实世界的例子
【发布时间】:2017-12-01 08:45:21
【问题描述】:

目前我正在阅读很多关于协程的内容。 虽然我认为我只部分了解了它们的作用(例如,允许返回一个函数并在某个时间点继续),但我真的不知道为什么要使用它们。我认为使用协程没有真正的好处。对我来说,这些东西在我看来就像带有额外步骤的 goto。有人可以给我一个很好的现实世界的例子,协程可以真正改善代码库吗?也许这有助于我理解这个概念。

【问题讨论】:

  • 您可以使用它们实现生成器,例如kirit.com/How%20C%2B%2B%20coroutines%20work
  • @Artur Biesiadowski 感谢您的回答,但与将 int 数设为静态并在最后一次通话时计数器结束的位置继续操作相比有什么好处? (我已经找到了那个例子)
  • 如果您有多个生成器实例并从不同的线程中使用它们,那么静态 int 将无法很好地工作。
  • 我可以给生成器一个模板 id(我不想惹恼你,但那是我的想法让我很难看到好处......)

标签: c++-coroutine


【解决方案1】:

协程允许我们以非常简单模块化的方式对cooperative multitasking系统建模。这种系统可以解决很多问题,比如多智能体游戏、股市模拟器、操作系统等。

简单来自这样一个事实,即我们可能只需要两个类似函数的协程就可以在代码中表达这个概念。不再需要类、状态结构、函数指针。下面是定义schedulertask 的伪代码说明。与普通函数不同,task 的两个实例在do_one_step 调用之后将执行传递给彼此。

void scheduler(list<task> tasks) {
   while(true) {
     for(t : tasks)
       await t;
   }
}

void task(int arg) {
   while(1) {
     do_one_step(arg);
     yield;
   }
}

void main() { await scheduler( list( { task(0), task(1) } ); }

更重要的是,task 的代码现在可以模块化:允许任务包含子任务,这与其结构相似。任何子任务本身都可以被设计为有效任务:

void subtask(int arg) {
  do_one_step(arg);
  yield;
  do_one_step(arg);
  yield;
}

void task(int arg) {
   while(1) {
     await subtask(arg);
     yield;
   }
}

void main() { await scheduler( list({task(0), task(1), subtask(2)}); }

协程允许我们将子任务堆叠成更大的任务,并为我们提供了一种新工具来模块化我们的解决方案。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2012-08-17
    相关资源
    最近更新 更多