原帖见(或者百度上搜索该标题):
http://www.yeolar.com/note/2013/02/17/coroutines/
这里将代码备份供自己使用:
先给看一段代码:
#include <stdio.h> typedef struct { int i; int num; int state; } task; #define crBegin(state) \ switch (state) { case 0: #define crReturn(state, ret) \ (state) = __LINE__; return (ret); case __LINE__: #define crEnd() \ } int cb(task *t) { crBegin(t->state); for (;;) { t->num = 1; for (t->i = 0; t->i < 20; t->i++) { crReturn(t->state, t->num); t->num += 1; } } crEnd(); } int main() { task t; int i; t.state = 0; for (i = 0; i < 100; i++) { printf("%d ", cb(&t)); } return 0; }
它会输出5组1 ~ 20的数字。是不是有点晕,我们把宏展开再看一下 cb 函数。为了便于阅读,做了一些调整
int cb(task *t) { switch (t->state) { case 0: for (;;) { t->num = 1; for (t->i = 0; t->i < 20; t->i++) { t->state = __LINE__ + 2; return t->num; case __LINE__: t->num += 1; } } } }
看清楚了吗?这其实是 switch 的一个技巧,通过它实现了一种断点的效果,类似于Python的 yield 。它是一个非常简单的C的协程实现。
接下来是一些理论方面的介绍,可以参考原帖。