iOS开发——高级篇——多线程GCD死锁

时间:2022-01-09 18:38:14

面试题

请问以下代码打印结果:

- (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这个地方,双方相互等待,形成了死锁。