執行緒互斥鎖與死鎖

2021-08-02 17:05:45 字數 1829 閱讀 8999

(1)首先來了解執行緒的同步與互斥:

當多個執行緒訪問同乙個程序時的臨界區時需要被同步與互斥保護避免產生衝突。比如當兩個執行緒都要把某個全域性變數增加1,這個操作在某平台上需要三條指令完成:1,從記憶體讀變數到暫存器。2,暫存器的值加1。3,將暫存器的值寫回記憶體。

來看這個程式:

(2)互斥鎖:

先來看mutex用pthread_mutex_t型別的變數表示,可以這樣初始化和銷毀:

返回值:成功返回0,錯誤返回錯誤碼。

mutex的加鎖與解鎖:

返回值:成功返回0,失敗返回錯誤碼。

乙個執行緒可以呼叫pthread_mutex_lock來獲得mutex,如果這時另乙個執行緒已經呼叫pthread_mutex_lock獲得了該mutex,則當前執行緒需要掛起等待,直到另乙個執行緒呼叫pthread_mutex_unlock釋放mutex,當前執行緒被喚醒,才能獲得該mutex並繼續執行。

如果乙個執行緒既想獲得鎖,又不想掛起等待,可以呼叫pthread_mutex_trylock,如果mutex已經被另乙個執行緒獲得,這個函式會失敗返回ebusy,這個函式會失敗返回ebusy,而不會使執行緒掛起等待。

現在我們來解決上面程式中提到的問題:

#include2 #include3 #define nloop 5000

4 5 int count=0;

6 pthread_mutex_t lock=pthread_mutex_initializer;

7 void *thread_count(void *arg)

8 {9 int i=0;

10 int tmp=0;

11 while(i

在互斥鎖的操作中,大多數體系結構都提供了swap或者exchange指令,該指令的作用是把暫存器和記憶體單元的資料相交換,由於只有一條指令,保證了原子性,即使是多處理器平台,訪問記憶體的匯流排週期也有先後,乙個處理器上的交換指令執行時另乙個處理器的交換指令只能等待匯流排週期。

(3)死鎖:

死鎖有兩種有兩種情形:一:如果同乙個執行緒先後兩次呼叫lock,在第二次呼叫時由於鎖已經被占用,該執行緒會掛起等待別的執行緒釋放鎖,然而鎖正是被自己占用著,該執行緒又被掛起而沒有機會釋放鎖,所以它就永遠停在等待狀態,這叫做死鎖。二:執行緒a獲得了鎖1,執行緒b獲得了鎖2,這時執行緒a呼叫lock試圖獲得鎖2,結果是需要掛起等待執行緒b釋放鎖2,而這時執行緒b也要呼叫lock試圖獲得鎖1,結果是需要掛起等待執行緒a釋放鎖1,於是執行緒ab都永遠處於掛起狀態了。

解決方法:在程式中我們一般使用pthread_mutex_trylock來代替pthread_mutex_trylock避免死鎖,或者使用一種稍微複雜一點的方法:如果執行緒需要多個鎖時都按照相同的先後順序獲得鎖。

綜上所述,形成死鎖的原因是:1,系統資源不足。2,執行緒推進的順序不當。3,資源分配不當。

執行緒之互斥鎖與死鎖

互斥鎖 1 互斥鎖基本原理 互斥鎖是乙個二元變數,其狀態為開鎖 允許0 和上鎖 禁止1 將某個共享資源與某個特定互斥鎖在邏輯上繫結 要申請該資源必須先獲取鎖 1 訪問公共資源前,必須申請該互斥鎖,若處於開鎖狀態,則申請到鎖物件,並立即占有該鎖,以防止其他執行緒訪問該資源 如果該互斥鎖處於鎖定狀態,則...

互斥鎖 死鎖與執行緒安全

一 典型的兩種死鎖情形 一 執行緒自己將自己鎖住 一般情況下,如果同乙個執行緒先後兩次呼叫lock,在第二次調 用時,由於鎖已經被占用,該執行緒會掛起等待占用鎖的執行緒釋放鎖,然而鎖正是被自己占用著的,該執行緒又被掛起而沒有機會釋放鎖,因此 就永遠處於掛起等待狀態了,於是就形成了死鎖 deadloc...

鎖 互斥鎖,死鎖

當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀態變...