6.哲學家就餐問題

哲學家就餐問題

有五個哲學家,他們的生活方式是交替的進行思考和進餐。哲學家們公用一張圓桌,分別坐在周圍的五張椅子上。在圓桌上有5個碗和5支筷子。平時一個哲學家進行思考,飢餓時便試圖取用其左、右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐。進餐畢,放下筷子又繼續思考。code

分析

  • 筷子是臨界資源,在一段時間內只容許一個哲學家使用
  • 用一個信號量表示一支筷子,由這5個信號量構成信號量組。

var chopstick:array[0……4] of semaphor資源

  • 全部信號量被初始化爲1

用記錄型信號量解決哲學家進餐問題

第i個哲學家的活動可買描述爲it

repeat 
	wait(chopstick[i]);		//拿起左邊筷子
	wait(chopstick[(i+1) mod 5]);	//拿起右邊筷子
	...eat...
	singal(chopctick[i]);	//釋放左邊筷子
	singal(chopstick[(i+1) mod 5]);		//釋放右邊筷子
	...
	think;
	until false;

問題

假如5個哲學家同時飢餓而各自拿起左邊的筷子,會使5個信號量均爲0;當他們再試圖拿起右邊筷子時,都將無限期的等待。map

解決方法

  • 至多4我的同時拿左邊的筷子,保證至少有一我的能夠進餐,最終釋放筷子使更多的人進餐。
  • 僅當哲學家的左右兩支筷子都可使用時,才容許他拿起筷子進餐。
  • 規定奇數號哲學家先拿起其左邊的筷子,再拿左邊的,偶數號哲學家則相反。即:一、2號人競爭1號筷子,三、4號人競爭3號筷子,即5我的都先競爭奇數號筷子,得到後再去競爭偶數號筷子,最後總會有某一人進餐。

用AND型信號量解決哲學家進餐問題

var chopstick:
	array[0...4] of semaphore := (1,1,1,1,1)

具體過程:方法

repeat 
	think;
	Swait(chopstick[(i+1) mod 5],chopstick[i]);
	eat
	SSingal(chopstick[(i+1) mod 5],chopctick[i]);
	think;
until false;
相關文章
相關標籤/搜索