行程同步與臨界區間問題

進展要求(progress requirement)

想像那間共用廁所是空的,有人在外面等,但門禁系統堅持:要先去問一個一小時前就離開大樓的人,才肯放人進去。廁所空著、有人需要,卻沒人進得去。這就是進展的失效。進展要求說:若目前沒有任何執行緒在臨界區間內,而至少有一條執行緒想進入,那麼「下一個由誰進入」的決定就不能被無限期拖延——想進去的人當中,必須真的有人進得去,而且要在合理的時間內。

更謹慎地說,進展有兩個部分。第一,只有正積極嘗試進入的執行緒(那些在進入區裡的)才能參與「下一個由誰進入」的決定;一條正在剩餘區做不相干工作、或已經做完回家的執行緒,絕不能因此阻擋其他人。第二,那個決定不能被永遠延後。這兩點合起來,就排除了那種尷尬局面:資源明明空著,執行緒卻在不必要地空等——這正是天真的「嚴格輪流」鎖的毛病:一條執行緒的「沒興趣」竟把另一條凍住了。

進展是活性:它保證好事(向前推進)終究會發生,相對地,互斥只保證壞事永遠不發生。它是最常被那些看起來很聰明的自製鎖違反的要求。一個機制可以有滴水不漏的互斥,卻仍過不了進展這關,使系統卡死——儘管資源根本是可用的。要注意,進展比公平性弱:它保證「有人在等時資源不會閒置」,但本身並不保證某一個特定的等待者不會被反覆略過——那個更強的承諾叫有限等待。

嚴格輪流:兩條執行緒共用 turn,各自只有在 turn 等於自己的代號時才能進入。執行緒 A 進入、離開,接著就在它的剩餘區裡永遠繞圈。此時 turn 卡在指著 A,於是執行緒 B 再也進不去,儘管臨界區間是空的。互斥成立;進展卻失敗了。

若資源空著而有人想要它,這個決定就不能被無限延後。

進展不等於公平。進展只是禁止「有等待者時資源仍閒置」;它仍允許某個等待者被永遠超車。要禁止那種情況,得靠有限等待。

又称
progress進展性前進性