iOS開發——高級篇——多線程GCD死鎖


面試題

請問以下代碼打印結果:

- (void)interview01
{
    // 以下代碼是在主線程執行的
    NSLog(@"執行任務1");
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"執行任務2");
    });
    
    NSLog(@"執行任務3");
    
}

答案:沒有打印,會產生死鎖

原因:

  判斷是否死鎖,由兩個因素決定:

  1、在當前線程同步執行任務還是異步執行任務

  2、隊列的類型,決定了任務的執行方式

上面這個例子,是個經典的死鎖問題,interview01這個任務是在主線程執行,dispatch_sync會立馬在當前線程(主線程)同步執行任務,也就是說dispatch_sync中的block需要立即執行完畢之后代碼才會繼續往下走,而主線程是在主隊列調度任務,此時調度的是interview01這個任務,主隊列(特殊的串行隊列),interview01這個任務沒有執行完就無法調度其他任務,所以dispatch_sync中的block在等interview01任務,而interview01這個任務又卡在了dispatch_sync這個地方,雙方相互等待,形成了死鎖。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM