C 多執行緒(4)之死鎖以及解決方法

2021-09-27 06:26:46 字數 1023 閱讀 7675

執行緒1需要先鎖鎖a,再鎖鎖b,才可以執行相應的保護**。執行緒2需要先鎖鎖b,再鎖鎖a,才可以執行相應的保護**。如果出現這種情況:執行緒1鎖住了鎖a,而執行緒2鎖住了鎖b,這個時候兩個程式都在等待對方解鎖。這就出現了死鎖現象。

**:

#include #include #include #include class a

} void readfunction()

my_mutex_2.unlock();

my_mutex_1.unlock();

} }private:

std::dequemy_deque;

std::mutex my_mutex_1;

std::mutex my_mutex_2;

};int main()

上面的**就是典型的死鎖程式。

方法一:

如果兩個程序,都是先鎖鎖a,再鎖鎖b,就避免了死鎖的現象。

方法二:

先來看**:

#include #include #include #include class a

} void readfunction()

my_mutex_2.unlock();

my_mutex_1.unlock();

} }private:

std::dequemy_deque;

std::mutex my_mutex_1;

std::mutex my_mutex_2;

};int main()

對比前面的**,就會發現我們用std::lock(my_mutex_1, my_mutex_2);替代了,my_mutex_1.lock();my_mutex_2.lock();這兩句。

std::lock(my_mutex_1, my_mutex_2);的作用就是,同時去鎖my_mutex_1, my_mutex_2,必須同時鎖成功,一旦有乙個互斥量不能被鎖,執行緒就會卡在這裡,直至兩個鎖可以被同時鎖成功,這樣就避免了死鎖的現象。

執行緒的故事 附4 多執行緒程式設計之死鎖

死鎖是指兩個或兩個以上的執行緒 程序 在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的執行緒 程序 稱為死鎖執行緒 程序 看個新聞先 伊朗說,你放了我們的格蕾絲,我們就放了你們的sten...

死鎖產生的條件以及解決方法

本文主要講為什麼會產生死鎖?如何避免以及發生死鎖該如何恢復死鎖?產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不可剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝奪。4 環路等待條件 若干程序之...

多執行緒問題及其解決方法

程序 就是乙個應用程式。執行緒 cup的切換執行線 使用者執行緒,沒有做其它操作,就是直接建立的執行緒。守護執行緒,可以對執行緒new thread setdaemon true 當主線程執行完成後,守護執行緒也立即結束。主線程就是程式在執行的標緻,當主線程結束,就是程式結束,程式結束所有的執行緒都...