GCD死锁

作者: jiangamh | 来源:发表于2015-11-07 18:23 被阅读129次

    写了一段gcd产生死锁的代码,其实早就见过这种代码了,记得当时,不理解,现在想想,这还是特别好理解的.

    代码1:

    -(void)gcdSyncTest

    {

           dispatch_queue_t serialQueue = dispatch_queue_create("com.test", DISPATCH_QUEUE_SERIAL);

         //任务1

          dispatch_sync(serialQueue, ^{

         //任务2

          dispatch_sync(serialQueue, ^{

          NSLog(@"hehe");

            });

        });

    }

    其实以上代码和以下代码 原理相同 同样产生了死锁现象。

    代码2:

    -(void)gcdSyncTest

    {

           任务2

           dispatch_sync(dispatch_get_main_queue(), ^{

           NSLog(@"hehe");

           });

    }

    其实,代码1,代码2有一种共同的原因,都使用了串行队列,还在串行队列中使用了 同步方式,首先,串行队列的特点,一次只能完成一件事件,排队FIFO方式执行,同步方式又恰恰要执行玩现在的事情,才能够做下一件事情。就如代码1,任务1中嵌套任务2,都要求同步方式执行,首先,要求执行完任务1在执行任务2,然而,任务1中嵌套了任务2,要求任务2完成了,任务1才能完成,其实这逻辑本身是冲突的,导致不能够在执行下去的局面,陷入了死锁状态。代码2也是同理,我们可以相想一下,其实任务2嵌套在另外一个任务1中,必须任务1执行完才能执行任务2,可是任务1又要求完成任务2才能执行,所以无法完成。

    相关文章

      网友评论

          本文标题:GCD死锁

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