Qt多執行緒之死鎖

2021-10-24 06:24:47 字數 1663 閱讀 7779

目錄

一、造成死鎖的原因

現象分析

二、死鎖的概念和發生條件

三、死鎖的避免

四、避免死鎖的示例**

一般性原則,每個臨界資源都需要乙個執行緒鎖來進行保護,假設有多個執行緒鎖該怎麼設計程式呢?先來看以下的乙個示例(**很簡單就不加注釋了):

qmutex g_mutex_1;

qmutex g_mutex_2;

class threadmutexa : public qthread

qdebug() << objectname() << ": run end...";

}};class threadmutexb : public qthread

qdebug() << objectname() << ": run end...";

}};int main(int argc, char *ar**)

1、現象:五個執行緒分別都進入了run()函式中,執行緒鎖1和執行緒鎖2分別被執行緒a和執行緒b獲取(這兩個執行緒動作比較快優先獲取到執行緒數)後,程式就阻塞在這裡了,不繼續往下執行了。

2、分析:

(1)當執行緒a獲取執行緒鎖1時,就要繼續獲取執行緒鎖2,但是此時執行緒鎖2被執行緒b獲取,執行緒a就只好等待執行緒鎖2被釋放;

(2)執行緒b獲取執行緒鎖2後,需要繼續獲取執行緒鎖1,而此時執行緒鎖1被執行緒a鎖獲取並沒有釋放,執行緒b也就只好等待執行緒a釋放執行緒鎖1了;

(3)兩個執行緒一直等待彼此釋放相應執行緒鎖,等到花都謝了也等不到,程式無法繼續執行。

3、原因:造成了執行緒的死鎖

1、死鎖概念:多執行緒之間相互等待臨界資源而造成彼此無法繼續執行。

2、死鎖發生條件:(1)系統中存在多個臨界資源且臨界資源不可搶占;(2)每個執行緒需要多個臨界資源才能繼續執行。

1、對所有臨界資源都分配唯一的序號(r1, r2, r3, ..., rn);

2、對應的執行緒鎖也分配同樣的序號(m1, m2, m3, ..., mn);

3、系統中的每個執行緒必須按照嚴格的公升序的次序去請求資源。

多執行緒之死鎖

1 死鎖發生的場景 有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題 thread1 synchronized object1 thread2 synchronized object2 看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開...

多執行緒之死鎖

死鎖。同步中巢狀同步。你有一根筷子,我有一根筷子,我要吃飯,你不給我,我不給你,誰都吃不著飯,死鎖發生,但是死鎖不一會發生,也會存在和諧的狀態,就是你把筷子給我,我吃一口,我再把筷子給你,你再吃一口 class ticket implements runnable else while true s...

java多執行緒之 死鎖

當兩個或多個執行緒競爭試圖獲取對方持有的同步鎖時,它們都會處於阻塞狀態,除非某個執行緒主動釋放自己所持有的同步鎖,這時,死鎖就出現了。用下面這張圖很好理解 如圖,執行緒thread1和thread2都有兩個同步方法operation1 operation2 operation1 中會呼叫operat...