子例程(subroutine)是經常使用的一種程序流程,父例程在調用子例程的時候暫時中斷自身的流程,將控制轉到子例程的起點,然后一直到子例程返回才繼續父例程的流程。這是一種棧式的調用,就是說后進入的子例程,卻要先返回。因此許多程序都是用棧來存放子例程的局部運行環境,因為當子例程返回 后,這個局部的運行環境就不需要了,也就是后進先出。
然而,有些例程之間并不是父例程調用子例程這種嵌套的關系,而是并行的協同關系,當一個例程運行時,需要另外一個例程所不斷產生的結果,例如兩個通過管道連接的程序就是這樣的關系。例程A需要數據,就把控制傳遞到例程B,而B產生一些數據,然后把控制返回給A,A處理完這些數據 以后會需要更多的數據,于是又把控制傳給B,這時并不是A重新調用B,而是恢復B剛才運行的斷點,讓B可以按照自己原先的流程繼續運行。例程A和例程B的 運行環境都需要保持,不存在誰必須先退出才能轉移控制的問題。控制在這兩個例程間跳來跳去,它們是協同的關系,例程B就成為例程A的協同例程,而不是子例 程了。