C 多執行緒死鎖

2022-05-08 14:33:12 字數 1740 閱讀 7488

死鎖問題被認為是執行緒/程序間切換消耗系統效能的一種極端情況。在死鎖時,執行緒/程序間相互等待資源,而又不釋放自身的資源,導致無窮無盡的等待,其結果是任務永遠無法執行完成。

死鎖出現的場景:當**中有2個鎖,鎖a和鎖b,也有2個執行緒,執行緒1和執行緒2,執行緒1執行時,先搶到鎖a,然後要去搶占b,同時執行緒2先搶到了鎖b,然後要去搶占鎖a,此時就出現死鎖情況,互相等待資源,又不釋放自身的資源。

如下**:

#include #include

#include

#include

#include

#include

#include

#include

using

namespace

std;

class

myclass

}void

removeorder()

m_mutex1.unlock();

m_mutex2.unlock();}}

private

: std::list

m_orderlist;

std::mutex m_mutex1;

std::mutex m_mutex2;

};int

main()

view code

解決方法:std::lock()

std::lock()的作用是:當有2給鎖時,要麼同時鎖上,要麼同時不鎖。就是當執行緒1執行時,先搶到鎖a,然後發現鎖b被別人占用時,此時搶不到鎖b,然後它就會把a鎖也釋放掉。

**如下:

#include #include

#include

#include

#include

#include

#include

#include

using

namespace

std;

class

myclass

}void

removeorder()

m_mutex1.unlock();

m_mutex2.unlock();}}

private

: std::list

m_orderlist;

std::mutex m_mutex1;

std::mutex m_mutex2;

};int

main()

view code

以下是對上面**優化,用到了lock_guard,防止上鎖後忘記解鎖。std::adopt_lock作用取消上鎖功能

#include #include

#include

#include

#include

#include

#include

#include

using

namespace

std;

class

myclass

}void

removeorder()}}

private

: std::list

m_orderlist;

std::mutex m_mutex1;

std::mutex m_mutex2;

};int

main()

view code

C 多執行緒 死鎖

相信有過多執行緒程式設計經驗的朋友,都吃過死鎖的苦。除非你不使用多執行緒,否則死鎖的可能性會一直存在。為什麼會出現死鎖呢?我想原因主要有下面幾個方面 1 個人使用鎖的經驗差異 2 模組使用鎖的差異 3 版本之間的差異 4 分支之間的差異 5 修改 和重構 帶來的差異 不管什麼原因,死鎖的危機都是存在...

多執行緒死鎖

這段時間剛好學到多執行緒,下面是自己對死鎖的一些感悟,並不是我說的有多到位,只是想到一種更為通俗易懂理解方式,現在和大家一起分享一下,有改進的地方,希望大家多提提意見。一 首先說一下死鎖的定義 由兩個或兩個以上的執行緒由於互相競爭資源,導致一種互相等待的狀態,如果沒有外力推動,則他們都無法進行下去。...

多執行緒死鎖

1 提出 多執行緒與多程序提高了系統資源的利用率,然而併發執行也會帶來一些問題,如死鎖。2 概念 死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖...