問題描述:有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。如果,很不幸地,每個哲學家拿起他或她左邊的筷子,那麼就沒有人可以吃到飯了。
哲學家進餐問題是乙個多執行緒運用的經典例子,涉及到執行緒同步/互斥,臨界區訪問問題以及死鎖問題。
問題思考:哲學家依次編號為:1,2,3,4,5,每個哲學家左側的筷子編號與哲學家的編號相同,則哲學家有側的筷子編號為哲學家的編號+1並對5取餘。假設每個哲學家總是先拿起左側的筷子,那麼,若5個哲學家執行緒都拿起了一根筷子,就將導致死鎖的發生。
解決方案一:最多允許4位哲學家拿起他左側的筷子,最終保證至少有一位哲學家可以吃到飯,並在用餐完畢後釋放筷子,使其他哲學家也可以吃到飯。
`#include
#include
#include
#include
#include
int chops[5]
=;//5只筷子的狀態
int phil[5]
=;//5位哲學家
void
*philos
(void*)
;int
main()
for(i=
0;i<
5;i++)if
(pthread_join
(pthnum[i],(
void*)
&stat)==-
1)return0;
}void
*philos
(void
*arg)
while
(chops[left]==1
);chops[left]==1
;printf
("哲學家%d拿起了%d號筷子,現在只有乙隻筷子,不能進餐\n"
,m,left)
;while
(chops[right]==1
);chops[right]=1
;printf
("\033[0;45;47m哲學家%d拿起了%d號筷子,現在有兩隻筷子,開始進餐\033[0m\n"
,m,right)
;sleep
(rand()
%3);
printf
("\033[0;33;47m哲學家%d進餐完畢\033[0m\n"
,m);
chops[left]=0
;printf
("哲學家%d放下了%d號筷子\n"
,m,left)
; chops[right]=0
;printf
("哲學家%d放下了%d號筷子\n"
,m,right);}
}`
解決方案二:當一位哲學家進餐完畢時,才允許其他哲學家拿起筷子
#include
#include
#include
#include
#include
int chops[5]
=,phil[5]
=,lock=0;
void
*philos
(void*)
;int
main()
for(i=
0;i<
5;i++)if
(pthread_join
(pthnum[i],(
void*)
&stat)==-
1)return0;
}void
*philos
(void
*arg)
哲學家就餐問題
本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...
哲學家進餐問題
哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...
哲學家就餐問題
pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...