多執行緒練習 哲學家問題

2021-08-26 10:55:11 字數 1117 閱讀 4750

哲學家進餐問題

在多執行緒中如何避免死鎖。

問題描述:有五位哲學家圍繞著餐桌坐,每一位哲學家要麼思考

要麼等待,要麼吃飯。為了吃飯,哲學家必須拿起兩支筷子(分

別放於左右兩端)不幸的是,筷子的數量和哲學家相等,所以每

只筷子必須由兩位哲學家共享

一、使用陣列來跟蹤乙個哲學家的的狀態:吃飯,思考或是試圖拿起筷子,規定乙個哲學家只有在兩個鄰居都不再進餐時才允許轉移到進餐狀態。這種方法可以使系統獲得最大的並行度,即最多允許兩個哲學家同時進餐。

二、給每個哲學家編號,規定奇數號的哲學家先拿他的左筷子,然後再去拿他的右筷子;而偶數號的哲學家則相反。這樣總可以保證至少有乙個哲學家可以進餐。

一般都使用第二種方法,高效而簡單。

普通解法,會死鎖,不過還得等好一會。電腦速度這麼快,也差不多等了五分鐘以後才死鎖。但是不管等多久死鎖,理論上講,死鎖是早晚的事,所以還是防著點好。

#include #include #include #include #include using namespace std; dword winapi philosopher(lpvoid lpparameter); void thinking(int); void eating(int); void waiting(int); void print(int ,const char *); //全域性變數 critical_section crout;//這個變數用來保證輸出時不會競爭 critical_section fork[5];//定義五個臨界變數,代表五更筷子 int main(int argc,char *argv) //建立五個哲學家 for(i = 0; i<5;i++) else }

哲學家多執行緒問題

問題描述 一圓桌前坐著5位哲學家,兩個人中間有乙隻筷子,桌子 有麵條。哲學家思考問題,當餓了的時候拿起左右兩隻筷子吃飯,必須拿到兩隻筷子才能吃飯。上述問題會產生死鎖的情況,當5個哲學家都拿起自己右手邊的筷子,準備拿左手邊的筷子時產生死鎖現象。解決辦法 1 新增乙個服務生,只有當經過服務生同意之後才能...

多執行緒 哲學家就餐問題

1 當哲學家的左右筷子均是可用的時候才能就餐,否則等待,很容易理解,一次最多能有兩個人同時就餐 public class philosophereating 當前執行緒組活動執行緒數 while thread.activecount 1 catch interruptedexception ex 哲...

多執行緒 哲學家就餐問題

哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手...