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

    NSLog(@"之前 - %@", [NSThread currentThread]);
    
    dispatch_sync(dispatch_get_main_queue(), ^{
         NSLog(@"sync - %@", [NSThread currentThread]);
    });
   
    NSLog(@"之后 - %@", [NSThread currentThread]);

运行结果:主线程卡死

打印:之前 - {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阻塞主线程造成死锁)