執行緒互斥量死鎖,與sleep沒有關聯

2021-10-10 23:32:39 字數 1597 閱讀 1463

pthread_mutex_lock(),執行緒互斥量死鎖,與sleep沒有關聯.

專案上,定位死鎖原因,無意中看到pthread_mutex_lock()以及 sleep()字樣的文章.說的模糊不清,但是又貌似有些因果.

反覆查閱資料以及測試,完全可以確認:

pthread_mutex_lock(),執行緒互斥量死鎖,與sleep沒有關聯.

如果乙個執行緒試圖對同乙個互斥量加鎖兩次(並且沒有其他執行緒釋放鎖),自身就會陷入死鎖狀態。當該執行緒第一次去向互斥量加鎖時,由於該互斥量上並沒有鎖,所以可以加鎖成功,但是該執行緒第二次去向互斥量加鎖,由於該互斥量上已經加過鎖了,所以會把自身掛起阻塞,直到該鎖被釋放,但是自己又被掛起了,所以不會有人去釋放的,這就造成了死鎖問題。

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

當乙個執行緒去申請乙個已經被持有,但是還沒有釋放的互斥量時,執行緒將會被阻塞,直到該互斥量被釋放。如果該互斥量不被釋放,該執行緒將會被一直阻塞。死鎖就是,乙個執行緒阻塞的等待乙個永遠不會為真的條件。

假設程式中現在有乙個互斥量,然後乙個執行緒對該互斥量已經加鎖,但是在加鎖和解鎖的這段**中,如果該區域**又試圖向該互斥量申請鎖,那麼就會造成自身掛起等待,從而導致死鎖。

假設程式中使用兩個互斥量,執行緒a首先鎖住乙個互斥量,然後執行緒b也鎖住另外乙個互斥量,擁有第乙個互斥量的執行緒a又去試圖鎖住第二個互斥量,而擁有第二個互斥量的執行緒b試圖申請鎖住第乙個互斥量,這就會導致兩個執行緒此時都在掛起堵塞中,兩個執行緒都在相互請求另乙個執行緒的資源導致兩個執行緒都無法向前執行,於是產生了死鎖問題。

上邊的兩種產生死鎖的場景是在互斥量的條件下,但是這造成死鎖的場景,並不侷限於互斥量,只要滿足產生死鎖的條件,就會出現死鎖。針對死鎖的概念,大牛們總結出來了四條產生死鎖的必要條件:

四個條件必須同時滿足,才會可能造成死鎖。只要有乙個條件不滿足,就不會造成死鎖。死鎖的產生並不僅會只有使用互斥量時會發生,只要滿足四個條件也可能產生死鎖。在系統中,有許多只能被互斥性訪問的獨佔資源,如請求獨占性的io裝置,印表機等,在對其進行操作時,也有可能造成死鎖。

互斥條件與鎖一樣,要麼能被申請,要麼就只能等待。在任意時刻,某份資源只能被乙個程序或執行緒使用。

占有和等待條件是指某個執行緒或程序,在占有某份資源後還可以申請其他的資源。

當某份資源被某一程序或執行緒占有時,不能被其他執行緒或程序強制性的搶占,只能被占有它的執行緒主動的釋放。

死鎖發生時,系統中一定有兩個或兩個以上的程序組成的一條環路,該環路中的每乙個執行緒或程序都在等待下乙個程序所占用的資源。

參考:

linux多執行緒學習(2)–執行緒的同步與互斥及死鎖問題(互斥量和條件變數)

C 多執行緒 互斥量 死鎖

在多執行緒的使用中,如果我們建立了多個執行緒,多個執行緒之間的執行順序是由cpu來完成排程的,因此我們如果需要在多執行緒中進行資料共享和通訊,就需要注意資料安全的問題,有可能我在乙個執行緒中正在執行對資料的操作,此時cpu通過上下文切換,把當前執行緒切換掉了,開始執行了別的執行緒,而別的執行緒本來希...

Linux之執行緒 互斥量mutex與死鎖

主要內容 1 互斥量及如何使用 2 什麼是死鎖,如何解決 3 什麼是讀寫鎖,如何使用 4 條件變數實現的生產消費者模型 5 訊號量實現的生產消費者模型 執行緒同步 協調步驟,順序執行。解決同步的問題 加鎖!資料混亂的原因 資源共享 獨享資源則不會 隨機排程 意味著資料訪問會出現競爭 執行緒間缺乏必要...

執行緒互斥鎖與死鎖

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