死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
例如,如果執行緒a鎖住了記錄1並等待記錄2,而執行緒b鎖住了記錄2並等待記錄1,這樣兩個執行緒就發生了死鎖現象。一,忘記釋放鎖
mutex _mutex;
void func()
二,單執行緒重複申請鎖
mutex _mutex;
void func()
void data_process()
三,雙線程多鎖申請
mutex _mutex1;
mutex _mutex2;
void process1()
void process2()
四,環形鎖申請
/*
* a - b
* | |
* c - d
*/
假設有a、b、c、d四個人在一起吃飯,每個人左右各有乙隻筷子。所以,這其中要是有乙個人想吃飯,他必須首先拿起左邊的筷子,再拿起右邊的筷子。現在,我們讓所有的人同時開始吃飯。那麼就很有可能出現這種情況。每個人都拿起了左邊的筷子,或者每個人都拿起了右邊的筷子,為了吃飯,他們現在都在等另外乙隻筷子。此時每個人都想吃飯,同時每個人都不想放棄自己已經得到的一那只筷子。所以,事實上大家都吃不了飯。
一,盡量避免同時只對乙個互斥鎖上鎖
二,互斥鎖保護區域不要使用操作其他互斥鎖的**。
三, 如果想同時對多個互斥鎖上鎖,要使用std::lock()
四,
給鎖定義順序(使用層次鎖,或者比較位址等),每次以同樣的順序進行上鎖。詳細介紹可看c++併發程式設計實戰。
如果另外乙個執行緒可能會依賴當前執行緒,則不要再讓當前執行緒依賴那個執行緒了
參考:
死鎖的解決辦法
什麼是死鎖 在多個執行緒共享資源的時候,如果兩個執行緒分別占有一部分資源,並且同時等待對方的資源,就會成死鎖現象。如果鎖之間相互巢狀,就有可能出現死鎖。因此盡量不要出現鎖之間的巢狀。解決辦法 1.儘量減少資源占用時間,可以有效降低死鎖發生概率。2.銀行家演算法。銀行家演算法 我們可以把作業系統看作是...
Oracle pl sql 死鎖解決辦法
查詢當前資料庫鎖的sql select a.session id,c.serial a.locked mode,b.object id b.object name b.object type,c.logon time,a.oracle username,a.os user name,b.owner,...
postgreSql檢視死鎖及解決辦法
1.檢視資料庫的程序。select from pg stat activity where datname 死鎖的資料庫id 檢索出來的字段中,wating 字段,資料為t的那條,就是死鎖的程序,找到對應的 procpid 列的值。例如 select procpid from pg stat act...