哲學家就餐問題(如何避免死鎖)(多執行緒版)

2021-10-19 19:54:16 字數 1077 閱讀 4961

多執行緒程式設計中,常常會遇到執行緒間訪問共享資源的問題,如果處理不當則會發生死鎖,某乙個執行緒可能永遠訪問不到共享資源。

為了避免死鎖的發生,提出哲學家就餐問題。

下面展示一些**片段

#include

#include

#include

#include

#include

#include

#include

#include

/* 多執行緒之間通過互斥鎖實現哲學家就餐問題(如何避免死鎖)

得到兩把鎖則進餐,只得到第一把鎖,得不到第二把鎖則釋放已經擁有的第一把鎖

*/pthread_mutex_t mutex[5]

;void

*tfun

(void

*arg)

else

while(1

)else

}pthread_exit

(null);

}int

main()

for(i=

0;i<

5;i++

)for

(i=0

;i<

5;i++

)for

(i=0

;i<

5;i++

)return0;

}

振盪:如果每個人都攥著自己左手的鎖,嘗試去拿右手鎖,拿不到則將鎖釋放。過會兒五個人又同時再攥著左手鎖嘗試拿右手鎖,依然拿不到。如此往復形成另外一種極端死鎖的現象——振盪。

程式中哲學家都先去拿左邊的筷子,再拿右邊的筷子,為了避免振盪,第四個哲學家反其道而行,先拿右邊的筷子,再拿左邊的筷子。

兩個筷子都拿到則進餐,如果只拿到第乙個筷子,沒有拿到第二個筷子,則釋放已有的筷子。

避免死鎖的方法:

1:若得不到所有所需的資源時,放棄已經獲得的資源,等待。

2:保證資源的獲取順序,要求每個執行緒獲取資源的順序一致,如:a獲取順序1、2、3;b順序也應該是1、2、3.若b為3、2、1則易出現死鎖的現象。

死鎖 哲學家就餐問題

在 死鎖 這一篇文章中,我們學習了死鎖相關的理論知識,本篇文章來看看死鎖案例 哲學家就餐問題,這篇文章主要來討論就餐問題的死鎖和多種死鎖修復的方法。看上圖,有五位哲學家,面前都有乙個盤子,盤子左邊和右邊都有一根筷子,他們在吃麵之前需要先拿起左邊的筷子再拿起右邊的筷子,有了一雙筷子就可以吃麵了。上面流...

死鎖與哲學家就餐問題

死鎖 死鎖是指多個資源之間互相等待對方的資源,而在得到對方的資源之前又不釋放自己的資源,這樣,造成迴圈等待的一種現象,如果所有程序都在互相等待乙個不可能發生的事件,則程序就死鎖了。死鎖產生的必要條件 1.互斥條件 程序對資源進行排他性使用,即在一段時間內對某資源僅為乙個程序所占用 2.請求和保持條件...

哲學家就餐問題

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