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