關於dispatch sync死鎖問題

2022-09-13 05:57:11 字數 1176 閱讀 1169

首先,我們來看下下面乙個例子:

**:(序列佇列裡同步執行緒巢狀)

nslog(@"haha");

dispatch_queue_t queue = dispatch_queue_create("test", nil);

dispatch_sync(queue, ^ );

nslog(@"xxoo2");

});執行結果:

2014-08-25 14:30:24.440 test[4424:60b] haha

2014-08-25 14:30:24.441 test[4424:60b] xxoo0

在test序列佇列中,有兩個同步執行緒巢狀導致第二個同步執行緒執行不了,產生了死鎖。

原因是:在序列佇列中,第二個同步執行緒要執行,必須等待第乙個同步執行緒執行完成後才可進行,但是第乙個同步執行緒要執行完又得等待第二個同步執行緒執行完,因為第二個同步執行緒巢狀在第乙個同步執行緒裡,這就造成了兩個同步執行緒互相等待,即死鎖。

特別強調:是在序列佇列裡!

dispatch_queue_t queue = dispatch_queue_create("test", nil);

這行**中,第二個引數為nil值,相當與值為dispatch_queue_serial,即為序列的。如果把值改成dispatch_queue_concurrent,即為並行的,就不會導致兩個同步執行緒死鎖。或者使用dispatch_get_global_queue(dispatch_queue_priority_default, 0)也行,因為dispatch_get_global_queue是並行佇列。

ok,我們來看第二個例子:

**:(主線程裡的同步執行緒)

nslog(@"haha");

dispatch_sync(dispatch_get_main_queue(), ^ );

執行結果:

2014-08-25 15:01:58.922 test[4797:60b] haha

結果還是死鎖,這個例子其實和第乙個例子是類似的,主線程其實就是在乙個序列佇列裡的,我們寫的這個同步執行緒就相當與第乙個例子的第二個巢狀的同步執行緒,因為這個同步執行緒是在主線程裡寫的,就相當於巢狀在主線程裡的。

所以,對於

dispatch_sync(queue, ^{});

這行**的意義可以概括為: 會阻塞當前執行緒等待序列queue中的所有任務執行完成後再向下執行。

關於linux kernel的死法

最近在除錯linux核心驅動,宕機無數次。關於linux的死法也有些心得。1 嘎嘣兒脆型。特點 啥提示也沒有,說宕就宕,var log messages 裡邊啥提示資訊也沒有。原因 八成是你自己沒玩兒好,在kernel裡邊記憶體越界了。還有兩成是超過了linux核心棧8k的限制。2 半死不活型。特點...

關於kernel power帶來的的反覆死亡

十一入手小新pro13,十月份因為kernel power自動重啟2次,十一月自動重啟4次,十二月至今18日自動重啟17次.我也是最近才意識到問題的嚴峻性,有時候隔幾小時黑一次藍一次的,真的想砸電腦。在此期間幾乎把網上涉及到軟體方面的措施用了個遍,畢竟剛用倆月的電腦,硬體故障的概率不高。但我還是照網...

關於QThread使用鎖死的探索

在學習使用qt5的時候,發現要使用多執行緒處理多工,按照等很多網上的方法,測試一下,發現我寫的程式執行就崩潰。不斷測試,發現乙個現象 子執行緒的初始化要在視窗初始的同時進行 程式 如下 ui mainwindow 視窗是qt desinger生成的 coding utf 8 form impleme...