GCD死锁

写了一段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才能执行,所以无法完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 什么是GCD ? GCD,全称 Grand Central Dispatch。可翻译为”牛逼的中枢调度器”。...
    顶级蜗牛阅读 342评论 0 2
  • Queue (队列): 分为串行和并行, 串行队列按顺序开始执行, 执行完上一个才能执行下一个. 并行队列(开始也...
    丹单当阅读 597评论 0 0
  • 死锁一直都是在使用多线程时,需要注意的一个问题。以前对同步、异步,串行、并行只有一个模糊的概念,想想也是时候整理一...
    VincentHK阅读 625评论 0 6
  • 死锁一直都是在使用多线程时,需要注意的一个问题。以前对同步、异步,串行、并行只有一个模糊的概念,想想也是时候整理一...
    船长One阅读 1,510评论 0 5
  • 因为本文只做分享用,非学术性文章,所以某些理论并不是非常严谨,望大家见谅。写下这篇文章有以下的目: 我写这篇文章时...
    写Blog不取名阅读 6,938评论 33 77