coroutine

coroutine 分 symmetry coroutine(yeild_to 方式) 和 asymmetry coroutine(yeild , resume).

实现方式有: 

Duff device 的stack-base 方式,state变量和switch或goto实现。(参考 http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html)

这种方式的实现的是隐式状态机,函数也不能使用局部变量。

 

setjmp 和 longjmp 实现,基于stack copy 方式,可以参考libconcurrency

stack copy比较妙,不过这也说明每次进出都要memcpy, 所以程序最好是浅堆栈,就是只保持有用的局部变量,能做成员变量不要写成局部变量,尽量把局部变量的生命周期和使用期限一致。局部变量还有个限制就是,不能再次使用局部变量的地址了,因为地址是可变的。

堆栈copy的方式,我是用在协议解析阶段。

 

filber, ucontext 实现,使用操作系统的纤程来模拟coroutine

这种方式适合堆栈较长的情形。

 

coroutine 可以用来取代状态机模型,帮助Developer以同步的方式写代码,但实际运行又是异步的。

缺点就是调试更麻烦了.

 

 

posted @ 2010-07-28 10:45  napoleon_liu  阅读(389)  评论(0编辑  收藏  举报