全球新動態:[ Linux ] 死鎖以及如何避免死鎖

2022-12-23 14:13:23 來源:51CTO博客


(資料圖片僅供參考)

1.什么是死鎖?

死鎖

死鎖是指在一組進程中的各個進程均占有不會釋放的資源,但因互相申請被其他進程所占用不會釋放的資源而處于的一種永久等待的狀態。

2.模擬死鎖情況

我們使用多線程模擬一個死鎖的情況。

#include #include #include #include using namespace std;pthread_mutex_t mutexA = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t mutexB = PTHREAD_MUTEX_INITIALIZER;void* startRoutine1(void* args){    while(true)    {        pthread_mutex_lock(&mutexA);        sleep(1);        pthread_mutex_lock(&mutexB);        cout<<"我是線程1,我的tid"<

當上面這段程序運行起來時,線程1和線程2會同時調用各自的startRountine函數,由于mutexA和mutexB均為臨界資源只有一份,而在程序中,線程1會先申請mutexA,線程2會先申請mutexB,而當他們申請結束時都會等待1秒(這里等待一秒是確保兩個線程各自占有一把鎖),一秒休眠結束后,當線程1想要申請mutexB時,由于mutexB已經被線程2占有且未釋放,因此線程1將阻塞等待mutexB的釋放;同理,線程2也會阻塞等待mutexA。此時,各線程均占有不會釋放的資源mutex,并且互相申請了其他線程所占用不會釋放的資源而除以一種永久等待的狀態。我們把這種狀態就稱為死鎖。當程序運行起來時,我們也能看到程序并沒有什么打印結果.....

我們使用監控腳本查看3個線程任然在運行之中

while :; do ps -aL | grep mythread ; sleep 1;echo "---------------";done

3.死鎖四個必要條件

死鎖的必要條件:死鎖情況一旦發生,這四個條件一定都要滿足。如果有一個沒有產生,那死鎖的條件便不成立。

互斥條件:一個資源每次只能被一個執行流使用請求與保持條件:一個執行流因請求資源而阻塞時,對已獲得的資源保持不敗不剝奪條件:一個執行流已獲得的資源,在未使用完之前,不能強行剝奪循環等待條件:若干執行流之間形成一種頭尾相接的循環等待資源的關系

4.避免死鎖的方法

破壞死鎖的四個必要條件加鎖順序一致避免鎖未釋放的場景資源一次性分配

5.避免死鎖的算法

銀行家算法(了解為主)

我們在當時將鎖的時候,查看過pthread_mutex_lock和pthread_mutex_unlock函數,我們也使用了,那么大家還記不記得其中還有一個trylock。這個函數就是用來嘗試申請,如果是安全序列則會正式分配,否則不會分配。

核心思想:

銀行家算法是一種最有代表性的避免死鎖的算法。在避免??死鎖??方法中允許進程動態地申請資源,但系統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。

標簽: 必要條件 程序運行

上一篇:環球看熱訊:Day19_07_Vue教程之Vue表單輸入
下一篇:當前最新:百度工程師教你玩轉設計模式(裝飾器模式)