GCD死鎖的理解

- (void)viewDidLoad {
    [super viewDidLoad];
    [self sync];
}
- (void)sync {
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"Thread--%@", [NSThread currentThread]);
    dispatch_sync(queue, ^{
        NSLog(@"sync1--%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync2--%@", [NSThread currentThread]);
        dispatch_sync(queue, ^{
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync3--%@", [NSThread currentThread]);
    });
}
  1. 以上代碼會造成死鎖,原因是viewDidLoad函數(shù)會在主線程執(zhí)行,當(dāng)主線程中有任務(wù)在執(zhí)行時,主隊列內(nèi)的任務(wù)會被阻塞。當(dāng)代碼執(zhí)行到dispatch_sync時,會將block內(nèi)的代碼放入主隊列。因為主隊列被viewDidload阻塞了,所以block不會被執(zhí)行。而dispatch_sync是同步函數(shù),需要block執(zhí)行完畢后才會返回,所以viewDidload和block相互阻塞,形成死鎖。
  2. 如果將同步函數(shù)隊列換成其他的其他隊列,無論是串行隊列還是并行隊列都不會造成死鎖。因為viewDidload被block阻塞時,block和viewDidload不在同一隊列,block不會被viewDidload阻塞,當(dāng)block自行完畢后viewDidload也會繼續(xù)執(zhí)行。
  3. 所以GCD的死鎖和線程無關(guān),是因為隊列的阻塞造成了任務(wù)的相互阻塞才形成死鎖。如果兩個任務(wù)不在同一隊列內(nèi)就不會造成死鎖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個最簡單的問題,以這個作為切入點好了 在ma...
    Mr_Baymax閱讀 2,909評論 1 17
  • 因為本文只做分享用,非學(xué)術(shù)性文章,所以某些理論并不是非常嚴謹,望大家見諒。寫下這篇文章有以下的目: 我寫這篇文章時...
    寫B(tài)log不取名閱讀 7,327評論 33 77
  • GCD 深入理解:第一部分 什么是 GCD GCD 是 libdispatch 的市場名稱,而 libdispat...
    willphonez閱讀 736評論 0 2
  • 雖然 GCD 已經(jīng)出現(xiàn)過一段時間了,但不是每個人都明了其主要內(nèi)容。這是可以理解的;并發(fā)一直很棘手,而 GCD 是基...
    隨風(fēng)飄蕩的小逗逼閱讀 1,573評論 0 2
  • 文/冰紫嫣 圖/來自網(wǎng)絡(luò) 時光無聲的腳步 從不曾癡情的為誰停留 它總是匆匆的路過 世上每個相同又不同的生命 值得等...
    冰紫嫣原創(chuàng)閱讀 350評論 0 2

友情鏈接更多精彩內(nèi)容