您的位置:首页 > 编程语言 > C语言/C++

谈谈协程和C语言的协程

2015-09-24 17:56 369 查看
原帖见(或者百度上搜索该标题):
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的协程实现。

接下来是一些理论方面的介绍,可以参考原帖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: