协程的概念很早以前就被提出,很多语言也实现了协程,例如Erlang,Lua。不过我首次接触协程是在学习golang的过程中,当真正使用协程的时候就被它的优雅和高效所折服,这也埋下了自己对协程好奇的种子。随着接触许多C++协程库,例如云风的coroutine、腾讯的libco、魅族的libgo等,很多当时模糊的概念也逐渐清晰。
云风的coroutine代码简介,实现了非对称的stackful协程,非常适合用来入门。笔者fork了该库,并根据自己对协程工作原理的理解为该库添加了注释,详细可参考我的github.
协程的定义
在计算机科学中,例程(过程、函数、方法、子程序)被定义为操作的序列。例程的执行形成了父子关系,且孩子例程总是在父例程前结束。举例说明,main函数中调用函数func1,func1中调用函数func2,此时就形成了父子关系(main为func1的父例程,func1是func2的父例程),func2执行结束进行函数栈回退,然后func1继续执行直到结束后进行函数栈回退,最后main继续执行直到结束后进行函数栈回退并退出程序。
协程是例程(过程、函数、方法、子程序)的范化概念。协程和例程的主要区别是,协程通过保持执行状态可以能够明确的挂起和恢复,协程通过维护上下文提供了增强的控制流。
2004年Lua的作者Ana Lucia de Moura和Roberto Ierusalimschy发表的论文Revisitin