协同程序是否有一个很好的真实世界示例

时间:2017-12-01 08:45:22

标签: c++-coroutine

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

1 个答案:

答案 0 :(得分:0)

协同程序允许我们以非常简单模块化方式对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)}); }

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