哲學家就餐問題 互斥鎖

2021-10-08 14:25:44 字數 1384 閱讀 9536

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

哲學家從來不交談,這就很危險,可能產生死鎖,每個哲學家都拿著左手的餐叉,永遠都在等右邊的餐叉(或者相反)。即使沒有死鎖,也有可能發生資源耗盡。例如,假設規定當哲學家等待另乙隻餐叉超過五分鐘後就放下自己手裡的那乙隻餐叉,並且再等五分鐘後進行下一次嘗試。這個策略消除了死鎖(系統總會進入到下乙個狀態),但仍然有可能發生「活鎖」。**如果五位哲學家在完全相同的時刻進入餐廳,並同時拿起左邊的餐叉,那麼這些哲學家就會等待五分鐘,同時放下手中的餐叉,再等五分鐘,又同時拿起這些餐叉。**為了解決這個機率極小的可能性,我們可以讓其中乙個哲學家不按常理出牌。下面會說明這個問題的解決方法。

在實際的計算機問題中,缺乏餐叉可以模擬為缺乏共享資源。一種常用的計算機技術是資源加鎖,用來保證在某個時刻,資源只能被乙個程式或一段**訪問。當乙個程式想要使用的資源已經被另乙個程式鎖定,它就等待資源解鎖。當多個程式涉及到加鎖的資源時,在某些情況下就有可能發生死鎖。例如,某個程式需要訪問兩個檔案,當兩個這樣的程式各鎖了乙個檔案,那它們都在等待對方解鎖另乙個檔案,而這永遠不會發生。

五個哲學家,五隻筷子,右手邊的是自己的筷子,左手邊是其他人的筷子,為了解決死鎖問題,可以讓哲學家e先用右手搶別人的筷子,然後再拿自己的筷子,這樣那個問題就解決了。

#include

#include

#include

#include

#include

pthread_mutex_t mutex[5]

;void

*dinner

(void

* arg)

else

if(num ==4)

while(1

)//右手解鎖

pthread_mutex_unlock

(&mutex[right]);

sleep

(rand()

%5);

}}intmain()

編譯的時候記得加上庫

gcc ***.c -o *** -lpthread

感謝點讚!!

哲學家就餐問題

本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...

哲學家就餐問題

pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...

哲學家就餐問題

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