C 多執行緒死鎖問題與解決方案

2021-10-08 23:58:09 字數 1180 閱讀 3033

當乙個多執行緒程式中存在多個互斥資源時,就有可能造成死鎖。比如有兩個執行緒t1和t2,兩個互斥鎖a和b,執行緒t1拿到了鎖a,在等待鎖b,一直到等到b才能往下執行,釋放鎖a,而此時執行緒t2拿到了鎖b,在等待鎖a,一直到等到a才能往下執行,然後釋放鎖b。即執行緒t1和t2在等對方持有的鎖,又都不肯釋放鎖,這時候執行緒t1和t2就會一直等下去了,在等待,永遠在等待。這就是死鎖。

下面是死鎖**的示例

#include #include #include std::mutex mtxa;

std::mutex mtxb;

void threadt1()

void threadt2()

int main()

執行結果如下圖

執行緒1一直在等待資源b,執行緒b一直在等待資源a,兩個執行緒都在等待,沒有退出。

由於多個執行緒獲取多個鎖資源的時候,順序不一致導致的死鎖問題,那麼保證它們獲取鎖的順序是一致的,問題就可以解決。針對上面的**執行緒1和執行緒b都先獲取a再獲取b,修改執行緒2函式如下。

void threadt2()

執行結果如下

多執行緒問題通常難於復現,難以調查。與其事後修改不如寫**時預防。編寫多執行緒需要注意的問題參考

c++多執行緒程式設計遇到的問題小結。

有以下幾點

1、對類中成員函式加讀寫專用函式,專用函式中加互斥鎖進行保護。

2、類中的成員函式要盡量避免在沒有保護的情況下對某個成員變數的多次讀取或者修改。

3、當乙個加鎖的函式中呼叫了另乙個加鎖函式時要注意檢查連個函式的鎖,如果是同一把鎖,會造成死鎖。

4、當乙個函式中有多個執行緒使用多個鎖時要檢查有沒有類似於第一部分相互等待的造成的死鎖問題。

5、對於加鎖的不可重入的函式,要使用pthread_mutex_trylock

對乙個函式加鎖,只能保證乙個函式不會被多個執行緒同時執行,但是無法避免多個執行緒先後執行同乙個函式,這時可以使用try_lock函式。該如果互斥鎖當前被另乙個執行緒鎖定,則該函式將失敗並返回false,而不會阻塞。

python多執行緒死鎖及解決方案

所謂死鎖 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 儘管死鎖很少發生,但一旦發生就會造成應用的停止響應。產生死鎖的 import threadi...

Java多執行緒專題 執行緒死鎖的原因解決方案

所謂死鎖,是指多個程序在執行過程中因爭奪資源而照成的一種僵局。當程序處於這種僵持狀態時,若無外力作用,它們都將無法再繼續執行。class threadtrain implements runnable else methoddesc 功能描述 火車票 public synchronized void...

c 多執行緒解決死鎖問題

可使用 monitor.tryenter 方法。雖然這種方法可以解決死鎖問題,但是最好還是不要出現死鎖這種情況。如果出現死鎖這種情況,就說明 有問題啊。還是在else裡面加個日誌記錄下吧,然後再解決。以下 來自網際網路 class program else new thread locktoomuc...