谈谈协程和C语言的协程
2015-09-24 17:56
369 查看
原帖见(或者百度上搜索该标题):
http://www.yeolar.com/note/2013/02/17/coroutines/
这里将代码备份供自己使用:
先给看一段代码:
它会输出5组1 ~ 20的数字。是不是有点晕,我们把宏展开再看一下 cb 函数。为了便于阅读,做了一些调整
看清楚了吗?这其实是 switch 的一个技巧,通过它实现了一种断点的效果,类似于Python的
yield 。它是一个非常简单的C的协程实现。
接下来是一些理论方面的介绍,可以参考原帖。
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的协程实现。
接下来是一些理论方面的介绍,可以参考原帖。
相关文章推荐
- C++ 格式控制符setiosflags
- More Effective C++ ——019_理解临时对象的来源
- C语言strtok()函数:字符串分割
- VC++_截取字符串
- effective c++ 条款23 perfer nonmember nonfreind function to member function
- C++的引用类型
- 细谈select函数(C语言)
- C++中template的.h文件和.cpp文件的问题
- 关于全局变量笔记
- c++中rand()函数返回值范围
- C++中输入输出的十六进制八进制
- c++中的构造函数
- 详解C++编程中的文件流与字符串流
- 数据机构与算法分析:C语言描述 第五章——Priority Queues(Heaps)中的5.4.2 Event Simiulation
- C++二分法在数组中查找关键字的方法
- C++中的重载
- 黑马程序员---C语言学习笔记之数组的基本概念和分类
- 解读C++编程的相关文件操作
- C++开源矩阵计算工具——Eigen的简单用法
- C语言strcpy,strncpy的用法