iOS GCD 死鎖理解

關鍵字:串行并行同步異步阻塞死鎖
作者:周輝
All rights reserved.

同步(dispatch_sync):

dispatch_sync(fcQueue, ^{ 
    NSLog(@"1"); // 任務 1 
}); 
NSLog(@"2");  // 任務 2
dispatch_sync(fcQueue, ^{ 
    NSLog(@"3"); // 任務 3 
}); 
NSLog(@"4"); // 任務 4

輸出:“1234”

異步(dispatch_async):

dispatch_async(serialQueue, ^{ 
    NSLog(@"1"); //任務 1 
}); 
NSLog(@"2"); 
dispatch_async(serialQueue, ^{ 
    NSLog(@"3"); //任務 3 
}); 
NSLog(@"4");

上面代碼執行結果可能為 “1234”、“1243”、“2134”、“2143”、“2413”中的一種,2 始終在 4 前面,1 始終在 3 前面,2 始終在 3 前面。

死鎖

NSLog(@"1"); // 任務1
dispatch_sync(dispatch_get_main_queue(), ^{ 
    NSLog(@"2"); // 任務2
});
NSLog(@"3"); // 任務3

輸出: 1

MainQueue.png

如圖所示,代碼中dispatch_sync(dispatch_get_main_queue(), ^{ });會獲取主線程(當前線程)阻塞之,執行完任務1就不會繼續走任務2,它會把任務2放到任務3后面,等到任務2執行完才會打通阻塞的地方繼續執行,可是任務2不可能執行完,因為主線程已經堵住了~

Go on

NSLog(@"1"); // 任務1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    NSLog(@"2"); // 任務2
});
NSLog(@"3"); // 任務3

輸出: 1 2 3

同步線程2

Go on

dispatch_queue_t queue = dispatch_queue_create("com.fcDemo.serialQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"1"); // 任務1
dispatch_async(queue, ^{
    NSLog(@"2"); // 任務2
    dispatch_sync(queue, ^{
        NSLog(@"3"); // 任務3
    });
    NSLog(@"4"); // 任務4
});
NSLog(@"5"); // 任務5

輸出:1 5 21 2 5

Go on

NSLog(@"1"); // 任務1
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"2"); // 任務2
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"3"); // 任務3
    });
    NSLog(@"4"); // 任務4
});
NSLog(@"5"); // 任務5

輸出: 1253415234

Go on

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"1"); // 任務1
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2"); // 任務2
    });
    NSLog(@"3"); // 任務3
});
NSLog(@"4"); // 任務4
while (1) {
}
NSLog(@"5"); // 任務5

輸出:1441


-“大圣,此去欲何?”
-“踏南天,碎凌霄。”
-“如若一去不回...”
-“便一去不回。”

有此等的英勇壯志奈何一個GCD乎?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本篇博客共分以下幾個模塊來介紹GCD的相關內容: 多線程相關概念 多線程編程技術的優缺點比較? GCD中的三種隊列...
    dullgrass閱讀 37,890評論 30 236
  • iOS中GCD的使用小結 作者dullgrass 2015.11.20 09:41*字數 4996閱讀 20199...
    DanDanC閱讀 887評論 0 0
  • 本篇博客共分以下幾個模塊來介紹GCD的相關內容: 多線程相關概念 多線程編程技術的優缺點比較? GCD中的三種隊列...
    有夢想的老伯伯閱讀 1,031評論 0 4
  • 死鎖一直都是在使用多線程時,需要注意的一個問題。以前對同步、異步,串行、并行只有一個模糊的概念,想想也是時候整理一...
    船長One閱讀 1,510評論 0 5
  • 窗外的小朋友還在嘰嘰喳喳,打打鬧鬧,而兒子卻早已進入夢鄉。從來不會因為明天休息,晚上讓他晚點睡覺,因為知道兒子覺多...
    薇薇冰朵閱讀 223評論 0 2