原帖見(或者百度上搜尋該标題):
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的協程實作。
接下來是一些理論方面的介紹,可以參考原帖。