哲學家問題

2021-10-06 17:28:39 字數 1901 閱讀 1894

問題描述:有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有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...