GCD之死锁

GCD相当好用,但用不好就会死锁,始终要记着这样一句秘籍:

不要在串行队列放dispatch_sync、dispatch_apply

下面看几个例子


// 防死锁秘籍:不要在串行队列放dispatch_sync、dispatch_apply

   // 死锁  主线程调用dispatch_apply

    dispatch_async(dispatch_get_main_queue(), ^{

        dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {

            NSLog(@"%ld",i);

            NSLog(@"%d",55);

        });

      });

    NSLog(@"%d",999);

    //死锁 主线程调用dispatch_apply

    dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {

        NSLog(@"%ld",i);

        NSLog(@"%d",777);

    });

   //不死锁

    dispatch_queue_t queue=  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_apply(5, queue, ^(size_t i) {

        NSLog(@"%ld",i);

         NSLog(@"%d",66);

    });

    NSLog(@"%d",88);

    //不死锁

    dispatch_async(queue, ^{

        dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {

            NSLog(@"%ld",i);

        });

    });

//    //不死锁

    dispatch_async(queue,^{

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"test");

        });

    });

    //死锁

    dispatch_sync(queue,^{

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"test");

        });

    });
时间: 2024-08-03 19:44:10

GCD之死锁的相关文章

GCD之死锁体会

1.先看下几句代码 dispatch_queue_t serialqueue=dispatch_queue_create("serialqueue", DISPATCH_QUEUE_SERIAL);//串行线程队列 dispatch_sync(serialqueue, ^{ NSLog(@"1"); }); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); }); 2.前面博文写了G

12个iOS技术面试题及答案总结_IOS

前言 随着移动互联网科技不断的发展和创新,如今无论是公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目,而面对iOS开发者及设计师在面试时可能会遇到的问题进行了筛选与汇总.下面我们一起来一下看看吧. 一.如何绘制UIView? 绘制一个UIView最灵活的方法就是由它自己完成绘制.实际上你不是绘制一个UIView,而是子类化一个UIView并赋予绘制自己的能力.当一个UIView需要执行绘制操作时,drawRect:方法就会被调用,覆盖此方法让你获得绘图操作的机会.当drawRect:方

iOS学习之GCD

GCD(Grand Central Dispatch),是 Apple 开发的一个多核编程的解决方法.该方法在 Mac OS X 10.6 雪豹中首次推出,并随后被引入到了 iOS4.0 中.GCD 是一个替代诸如NSThread,NSOperationQueue, NSInvocationOperation 等技术的很高效和强大的技术. GCD 和 block 的配合使用,可以方便地进行多线程编程. 1.优势: 1)  苹果官方为多核的并行运算提出的解决方案. 2)  会自动利用更多的CPU内

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

GCD 深入理解(一)

本文由@nixzhu翻译至raywenderlich的<grand-central-dispatch-in-depth-part-1> 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD .   在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示.在第二

漫谈GCD

多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西.同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂.如果使用过程中对多线程不够熟悉,很可能会埋下一些难以预料的坑. iOS中的多线程技术主要有NSThread, GCD和NSOperation.他们的封装层次依次递增,其中: NSThread封装性最差,最偏向于底层,主要基于thread使用 GCD是基于C的API,直接使用比较方便,主要基于task使用 NSOperation是基于GCD封装的N

Grand Central Dispatch (GCD)

Grand Central Dispatch (GCD) Reference Grand Central Dispatch (GCD) comprises language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore ha

iOS开发之深入理解GCD

本文翻译自 http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 原作者:Derek Selander 译者:@nixzhu Github: https://github.com/nixzhu/dev-blog   虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的

菜鸟不要怕,看一眼,你就会用GCD,带你装逼带你飞

相信读者已经看过很多大神们对GCD深入浅出的分析,这也是老生常谈的一个多线程的实现方式了,所以我也就不再啰嗦其理论.但是到底有多少方法是我们日常编程中常用的?又有多少是你不知道的?今天,我就来例举一些GCD的方法,绝对让你看一眼就会正确得使用. 与其说CGD是线程管理,不如说是队列管理,那么我们先来介绍一下GCD中常用的队列: Serial Diapatch Queue 串行队列 当任务相互依赖,具有明显的先后顺序的时候,使用串行队列是一个不错的选择 创建一个串行队列: dispatch_que