尽管可以有不同的翻译,coroutine本文被叫作协程。
概念
Coroutine是相对于routine(过程)而提出的,它与一般的父程序调用子程序的routine不同之处在于,它允许挂起一个程序执行点,过后再从挂起的地方继续运行,是一种更高级的程序运行顺序控制。为保证程序挂起再恢复,协程有其自己的栈和控制块,记录挂起时的状态。
协程有如下特点:
- 同其他数据类型一样,协程也是第一类(first-class)对象,可以被当参数传递等操作;
- 运行特点是挂起运行,离开协程,过后再进入,恢复运行;
- 具有对称和非对称的转移控制机制
- 挂起前和恢复后本地变量的值是一致的;
- 有stackless和stackful两种类型
对称转移是指所有协程都是对等的,协程控制权跳转时,必须显式指明将控制权转给谁。非对称转移是指协程记录调用者,因此可以隐式转移控制权(给调用者)。
stackful协程能从嵌套的栈结构中恢复,而stackless协程,因为没有保存栈,因而只能在最上层(top-level)的过程中使用,被最上层过程调用的过程就不能再挂起了,也就是不能有两个协程同时被挂起。
为实现协程,一些语言特别引入了关键字,在语言层面支持协程,但目前C++不是如此,例如下文的Boost.Asio中,虽然定义了yield,但其实是一个宏。
协程与回调函数
采用协程与采用回调通常被用来对比。而它们通常与事件驱动式编程有关。
事件驱动式编程方式如下图:
有若干断续发生的事件源(source),若干个处理程序(handler),中间有