子例程(subroutine)是经常使用的一种程序流程,父例程在调用子例程的时候暂时中断自身的流程,将控制转到子例程的起点,然后一直到子例程返回才继续父例程的流程。这是一种栈式的调用,就是说后进入的子例程,却要先返回。因此许多程序都是用栈来存放子例程的局部运行环境,因为当子例程返回 后,这个局部的运行环境就不需要了,也就是后进先出。
然而,有些例程之间并不是父例程调用子例程这种嵌套的关系,而是并行的协同关系,当一个例程运行时,需要另外一个例程所不断产生的结果,例如两个通过管道连接的程序就是这样的关系。例程A需要数据,就把控制传递到例程B,而B产生一些数据,然后把控制返回给A,A处理完这些数据 以后会需要更多的数据,于是又把控制传给B,这时并不是A重新调用B,而是恢复B刚才运行的断点,让B可以按照自己原先的流程继续运行。例程A和例程B的 运行环境都需要保持,不存在谁必须先退出才能转移控制的问题。控制在这两个例程间跳来跳去,它们是协同的关系,例程B就成为例程A的协同例程,而不是子例 程了。