美文网首页iOS开发Kevin的IOS开发专题
iOS开发-dispatch_sync阻塞主线程造成死锁

iOS开发-dispatch_sync阻塞主线程造成死锁

作者: Pandakingli | 来源:发表于2017-11-12 10:52 被阅读10次
        NSLog(@"之前 - %@", [NSThread currentThread]);
        
        dispatch_sync(dispatch_get_main_queue(), ^{
             NSLog(@"sync - %@", [NSThread currentThread]);
        });
       
        NSLog(@"之后 - %@", [NSThread currentThread]);
    

    运行结果:主线程卡死

    打印:之前 - <NSThread: 0x6000000610c0>{number = 1, name = main}
    

    原因:
    同步任务会阻塞当前线程,然后把 Block 中的任务放到指定的队列中执行,只有等到 Block 中的任务完成后才会让当前线程继续往下运行。

    那么这里的步骤就是:
    打印完第一句后,dispatch_sync 立即阻塞当前的主线程,然后把 Block 中的任务放到 main_queue 中, main_queue 中的任务会被取出来放到主线程中执行,但主线程这个时候已经被阻塞了,所以 Block 中的任务就不能完成,它不完成,dispatch_sync 就会一直阻塞主线程,这就是死锁现象。导致主线程一直卡死。

    同样的题目:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        NSLog(@"1");
    
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    }
    
    

    答案:只输出:1 。发生主线程锁死。

    相关文章

      网友评论

        本文标题:iOS开发-dispatch_sync阻塞主线程造成死锁

        本文链接:https://www.haomeiwen.com/subject/pcenmxtx.html