1. 程式人生 > >經典同步問題

經典同步問題

1、生產者—消費者問題

互斥、同步

1、無論生產者、消費者使用緩衝池時應保證互斥使用(互斥訊號量mutex )
2、生產者和消費者間交叉有序:
有序的控制最根源在產品數量上。
設定兩個訊號量:分別針對生產者、消費者設定不同的訊號量,
empty和full分別表示緩衝池中空緩衝池和滿緩衝池(即產品)的數量。
empty、full兩者有天然的數量關係,在PV控制下值不斷變化,但在值等於0的點上是控制順序的關鍵。

 

1、每個程式中用於實現互斥的wait(mutex)和signal(mutex)必須成對地出現。
2、控制順序的訊號量empty和full的wait和signal操作,成對地出現在不同的程序中。
3、在每個程式中的多個wait操作順序不能顛倒。且應先執行對資源訊號量的wait操作,
再執行對互斥訊號量的wait操作,否則可能引起程序死鎖。
4、模擬交替執行過程,檢查控制是否正確。

2、哲學家就餐問題

互斥

筷子是臨界資源,在一段時間內只允許一個哲學家使用。為實現對筷子的互斥使用,
用一個訊號量表示一隻筷子,五個訊號量構成訊號量陣列。

第i 位哲學家的活動可描述為:
repeat
wait(chopstick[ i ]);
wait(chopstick[ ( i +1) mod 5] );

eat;

signal(chopstick[ i ]);
signal(chopstick[ ( i +1) mod 5] );

think;
until false;

假如五位哲學家同時飢餓而各自拿起左邊的筷子時,就會使五個訊號量chopstick均為0,
當他們再試圖去拿右邊的筷子時,都將因無筷子可拿而無限等待。

1、控制數量

至多隻允許有四位哲學家同時去拿左邊的筷子,最終能保證至少有一位哲學家能夠進餐,
並在用畢後釋放出他用過的兩隻筷子,從而使更多的哲學家能夠進餐。---限制併發執行的程序數

2、一刀切

僅當哲學家的左右兩隻筷子均可用時,才允許他拿起筷子進餐。---採用AND訊號量。

3、IF程式設計控制

規定奇數號哲學家先拿他左邊的筷子,然後再去拿右邊的筷子;偶數號哲學家則相反。
保證總會有一個哲學家能同時獲得兩隻筷子而進餐

3、讀者—寫者問題

有條件互斥

1、一個數據檔案被多個程序共享。
Reader程序只要求讀檔案,Writer程序要求寫入內容。
2、合理的同步關係是:
多個讀程序可同時讀;
Writer程序與任何其他程序(包括Reader程序或其他Writer程序)不允許同時訪問檔案。

寫者操作要和其他的都互斥,所以必要判斷互斥訊號量,沒有變化。
只有第一個讀程序進行互斥判斷;
只要有一個“讀程序”在讀就不釋放,“寫程序”就不能寫。(一種讀者優先的方式)

引入訊號量L控制讀者的數目,初值為RN。
互斥訊號量mx,初值為1。
利用訊號量集的一種特殊情況——開關。
讀者:判斷L,判斷是否有寫者;
寫者:判斷是否有讀者;