【iOS】GCD之同步死鎖

這是一道面試題!??!

下面這段代碼的執(zhí)行結(jié)果是什么呢?自己動手試試吧
dispatch_queue_t queue = dispatch_queue_create("test.queue", nil);
    dispatch_sync(queue, ^{
        NSLog(@"111");
        dispatch_sync(queue, ^{
            NSLog(@"222");
        });
        NSLog(@"333");
    });

對,結(jié)果就是APP掛掉了~哈哈哈哈哈哈
言歸正傳吧還是- -!

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

創(chuàng)建了一個名稱為test.queue的串行隊列(第二個參數(shù)為nil,創(chuàng)建的是serial)。
1.將dispatch_sync整體加入到主線程隊列中
2.執(zhí)行sync,將111,sync,222加入到queue隊列中,因為是個串行隊列,所以需要一步一步執(zhí)行。
打印111沒問題,然后,就沒有然后了。

  queue的隊列中           現(xiàn)在queue的隊列
 NSLog(@"111")  |         | NSLog(@"111") 
 dispatch_sync() |         |dispatch_sync()
 NSLog(@"333")|         |NSLog(@"333")
                                      | NSLog(@"222")  block任務(wù)加到隊末尾

因為是串行按順序執(zhí)行的 NSLog(@"333"),在等著sync的執(zhí)行,而NSLog(@"222")在等著NSLog(@"333")的執(zhí)行,結(jié)果就是誰也別執(zhí)行了,這就是同步死鎖。。。。。。。。

最后編輯于
?著作權(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)容

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