美文网首页
GCD死锁分析

GCD死锁分析

作者: Gu_Liang | 来源:发表于2018-03-27 12:15 被阅读1次

首先清楚一点就是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是并发队列,所以平时一直用的这个也没遇到过死锁吧。

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

相关文章

  • 说说GCD中的死锁

    本文主要举例说明GCD里的死锁场景,分析造成死锁的原因以及解决方案 在开始说GCD死锁之前,我们先了解一下GCD的...

  • 552,GCD的死锁(面试点:gcd死锁:一,主线程调用主线程。

    本文主要举例说明GCD里的死锁场景,分析造成死锁的原因以及解决方案 在开始说GCD死锁之前,我们先了解一下GCD的...

  • GCD死锁分析

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

  • GCD 死锁案例分析

    案例一:主队列,同步线程 任务1执行后,同步线程任务2加到主队列中,任务3会等待任务2执行完成后执行 对于队列,有...

  • GCD 死锁 案例 分析

    作者: brighttj(@saitjr题目: 五个案例让你明白GCD死锁网址:http://www.brigh...

  • GCD 死锁

    GCD死锁 同步 异步 串行 并发

  • IOS开发 GCD产生死锁的总结

    在IOS开发中GCD的使用频率很高,但是使用不当,则会产生死锁,以下是我的对GCD产生死锁的总结。 了解死锁之前首...

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

  • 带你分分钟了解GCD多线程的死锁

    带你了解GCD多线程的死锁 阐述: 1.什么是GCD? GCD,全称 Grand Central Dispatch...

  • GCD避免死锁的三要素

    平时总在用GCD,但你知不知道,GCD一不小心就会出现死锁,如果死锁在主线程上,整个程序就完了,所以避免死锁是我们...

网友评论

      本文标题:GCD死锁分析

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