經典同步問題二——哲學家進餐問題

系列同步問題:
經典同步問題一——生產者和消費者問題
https://blog.csdn.net/weixin_36465540/article/details/105560002
經典同步問題二——哲學家進餐問題
https://blog.csdn.net/weixin_36465540/article/details/105564907
經典同步問題三——讀者寫者問題
https://blog.csdn.net/weixin_36465540/article/details/105565495

哲學家進餐問題

問題描述

五個哲學家住在一起,每個人的生活由喫飯思考組成。飯桌上有一盤菜,五個人每個人一個盤子一支叉子。想喫飯的哲學家會到桌子邊的位置上,拿起左、右兩個叉子,從中間的盤子中取菜放到自己的盤子中。
條件:防止叉子互斥使用;防止死鎖和飢餓。

解決方案一

在這裏插入圖片描述
給哲學家和叉子分別從0到4標號,0號哲學家喫飯時需要0和1號叉子,1號哲學家需要1和2號叉子……4號哲學家需要4和0號叉子。即 i 號哲學家需要 i 和 (i+1)%5 號叉子。由於叉子是互斥使用的,故我們爲每個叉子設置一個信號量。這裏可以設置一個長度爲5的信號量數組,用下標表示叉子的編號。解決互斥問題,故初值都設爲1。
缺點:5個哲學家都坐在座位上順次拿起自己左邊的叉子,即都執行了wait(fork[i]),那麼他們的下一步操作即wait(fork[(i+1)%5])都會使進程進入等待狀態,由於都無法執行到signal釋放臨界區,故發生死鎖。

Semaphore fork[5] = { 1 };
int i;
void philosopher(int i) {
	while (true) {
		think();
		
		wait(fork[i]);
		wait(fork[(i+1)%5]);
		eat();
		signal(fork[(i+1)%5]);
		signal(fork[i]);
	}
}

解決方案二

通過限制進餐人數防止死鎖問題,最多可以有N-1個人,即人數要比座位數少1。具體方法爲添加一個信號量room.value,控制人數。

Semaphore room.value = 4;
Semaphore fork[5] = { 1 };
int i;
void philosopher(int i) {
	while (true) {
		think();
		
		wait(room);
		wait(fork[i]);
		wait(fork[(i+1)%5]);
		eat();
		signal(fork[(i+1)%5]);
		signal(fork[i]);
		signal(room);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章