條件變數解決死鎖的簡單例子

2021-10-04 06:12:55 字數 914 閱讀 6749

兩個執行緒a1、a2,a是共享資源,初始值為0。a1是生產者,訪問共享資源並對它加一,a2是消費者,訪問共享資源,直到非零,列印出來。

乙個問題是,當a2首先訪問共享資源,並對此上鎖時,a1無法訪問a,更無法修改它。此時a2進入死迴圈,造成死鎖。

#include

#include

#include

using

namespace std;

int a =0;

mutex mt;

voida1(

)voida2(

) cout << a << endl;

}void

main()

解決死鎖的辦法就是用條件變數。

當執行緒a2判斷資源不滿足條件時,並不是直接等待,而是將鎖掛在乙個條件變數上,在這個過程中,會自動執行mutex.unlock(),釋放鎖。a1檢測到鎖可用時,拿到鎖的許可權,訪問a並做修改,然後條件變數通過notify_all()函式喚醒執行緒,注意的是,通知的過程並不釋放鎖,直到執行mutex.unlock()。執行緒a1結束釋放鎖,a1就能拿到鎖,訪問資源。

#include

#include

#include

#include

using

namespace std;

int a =0;

mutex mt;

condition_variable cv;

voida1(

)voida2(

) cout << a << endl;

}void

main()

unique_lockstd::mutex 是對mutex上鎖,解鎖的封裝,**塊結束之後,自動執行unclock()。

死鎖的概念 產生的必要條件 避免和解決死鎖的辦法

死鎖,是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當程序處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。如下圖所示 如果此時有乙個執行緒 a,已經持有了鎖 a,但是試圖獲取鎖 b,執行緒 b 持有鎖 b,而試圖獲取鎖 a,這種情況下就會產生死鎖。由於系統中存在一些不可剝奪資源,而當...

產生死鎖的原因和必要條件 解決死鎖的方法

死鎖 指多個程序因競爭共享資源而造成的一種僵局,若無外力作用,這些程序都將永遠不能再 向前推進。安全狀態與不安全狀態 安全狀態指系統能按某種程序順序來為每個程序分配其所需資源,直 至最大需求,使每個程序都可順利完成。若系統不存在這樣乙個序列,則稱系統處於不安全狀態。產生死鎖的原因 1 競爭系統資源 ...

產生死鎖的原因和必要條件 解決死鎖的基本方法

死鎖 指多個程序因競爭共享資源而造成的一種僵局,若無外力作用,這些程序都將永遠不能再 向前推進。安全狀態與不安全狀態 安全狀態指系統能按某種程序順序來為每個程序分配其所需資源,直 至最大需求,使每個程序都可順利完成。若系統不存在這樣乙個序列,則稱系統處於不安全狀態。產生死鎖的原因 1 競爭系統資源 ...