GCD死锁分析

首先清楚一点就是dispatch_sync程序需等待这个结果才执行下一步,dispatch_async无需等待结果继续执行下一步。

//注:这里的任务不要单纯看作是一个简单的log输出,也可以是一个复杂的操作。

简单异步操作

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"任务1");

        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"任务2");

        });

        NSLog(@"任务3");

    });

    NSLog(@"任务4");

//任务1、4随机输出

//任务3和任务1在一个队列,所以任务3在任务1后面输出

//任务2加入了主队列,添加在主队列最后面所以在任务4后面输出

最简单的死锁

dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"任务1");

});

NSLog(@"任务2");

//死锁 无输出。因为任务1加入了主队列最后面,等待任务2完成;而这时因为dispatch_sync所以任务2又在等待任务1完成所以就造成了死锁

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"任务1");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"任务2");

        });

        NSLog(@"任务3");

    });

    NSLog(@"任务4");

//任务1、4随机输出

//因为dispatch_sync 任务3等待任务2完成,又因为任务2加入的是主队列,所以任务2等待任务4完成。所以执行顺序是任务4->任务2->任务3

dispatch_queue_t serialQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);

    dispatch_async(serialQueue, ^{

        NSLog(@"任务1");

        dispatch_sync(serialQueue, ^{

            NSLog(@"任务2");

        });

        NSLog(@"任务3");

    });

    NSLog(@"任务4");

//任务1、4随机输出

//死锁 任务2和任务3不执行。原因:因为serialQueue是串行队列,所以同步时把任务2添加到任务3后面,又因为同步任务3等待任务2完成,所以就造成了死锁。

注:如果serialQueue是并发队列就不会造成死锁,因为并发队列并不会把任务2添加到任务3后面。还有值得注意的是dispatch_get_global_queue是并发队列,所以平时一直用的这个也没遇到过死锁吧。

这些都是本人对线程的一些理解,如有错误请指正。

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

推荐阅读更多精彩内容

  • 道之道,非常道。 茶道,众说纷纭,每个茶人都有自己的茶道。像武林界有各种教派一样,传统文化中也存在着不同的思想体系...
    兰花草儿阅读 4,610评论 0 0
  • 本周是2017年的12月份的第一周,在一百年多年前的12月人类第一次完成一次伟大的探险,第一次登上南极点。因为在这...
    胡晓军阅读 1,664评论 0 0
  • 不是猫阅读 1,462评论 0 0
  • 地铁。拥挤的逼仄。昏暗的柔软的风,沙丁鱼一般的熟悉。暗流涌动,轻易地翻滚起尘封已久的记忆。 喜欢周迅沙哑干净的声音...
    白末末阅读 1,781评论 0 0
  • 当下,很多人在职场中跳来跳去,极不稳定。据了解,有的人能在一年的时间里更换六七个工作。问其原因,无外乎就是职位权重...
    小新哥微课堂阅读 3,783评论 0 0