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以同步的方式写代码,但实际运行又是异步的。
缺点就是调试更麻烦了.