【iOS】GCD之同步死锁

这是一道面试题!!!

下面这段代码的执行结果是什么呢?自己动手试试吧
dispatch_queue_t queue = dispatch_queue_create("test.queue", nil);
    dispatch_sync(queue, ^{
        NSLog(@"111");
        dispatch_sync(queue, ^{
            NSLog(@"222");
        });
        NSLog(@"333");
    });

对,结果就是APP挂掉了~哈哈哈哈哈哈
言归正传吧还是- -!

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

创建了一个名称为test.queue的串行队列(第二个参数为nil,创建的是serial)。
1.将dispatch_sync整体加入到主线程队列中
2.执行sync,将111,sync,222加入到queue队列中,因为是个串行队列,所以需要一步一步执行。
打印111没问题,然后,就没有然后了。

  queue的队列中           现在queue的队列
 NSLog(@"111")  |         | NSLog(@"111") 
 dispatch_sync() |         |dispatch_sync()
 NSLog(@"333")|         |NSLog(@"333")
                                      | NSLog(@"222")  block任务加到队末尾

因为是串行按顺序执行的 NSLog(@"333"),在等着sync的执行,而NSLog(@"222")在等着NSLog(@"333")的执行,结果就是谁也别执行了,这就是同步死锁。。。。。。。。

你可能感兴趣的:(【iOS】GCD之同步死锁)