原帖见(或者百度上搜索该标题):
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的协程实现。
接下来是一些理论方面的介绍,可以参考原帖。