1.先看下几句代码

1
2
3
4
5
6
7
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.前面博文写了GCD之死锁http://www.cnblogs.com/cuiyw/p/4369041.html写了这样一句:防死锁秘籍:不要在串行队列放dispatch_sync、dispatch_apply,这几天一直想着这句话,今天看用户自定义线程队列时,看到串行线程队列,所以就想着验证着句话是否正确,以为像上面那样写,两个都会死锁,运行了下发现并不像想象当中的那样。第一个能够输出,这让我大吃一惊,以为这句话难道不正确是错误的?有看了下同步异步,并敲代码体会了一下,发现是自己理解错误。

3.dispatch_sync、dispatch_apply这些都有体现同步。同步是阻塞当前线程,把参数中的block语句添加到参数中的线程队列中执行,待执行完毕后,返回阻塞的地方继续执行。

比如上面的两个同步:

第一个:当前运行的是主线程队列,mian queue,运行到dispatch_sync 时,主线程挂起,开始将block添加到自定义的串行线程队列中,待执行完毕后返回到当前主线程队列main queue。所以并不会产生死锁。

第二个:当前主线程执行到第二个同步时,阻塞,开始将block添加到主线程队列中,此时主线程队列等待block执行,而block这边等待主线程队列执行完,这样就产生了死锁。

4.再看如下代码:

1
2
3
4
5
6
7
8
9
10
dispatch_sync(queue,^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"1");
        });
   });
   dispatch_sync(queue,^{
       dispatch_sync(dispatch_get_main_queue(), ^{
           NSLog(@"2");
       });
   });

上面两部分代码第一个不会死锁,而第二个会死锁。

个人分析理解,不一定正确。

第一个:主线程是串口线程队列,执行到sync的时候阻塞主线程队列,将block添加到全局线程队列中,全局线程队列开启一个线程,以异步的方式将最里面的block添加到主线程串口队列中,并返回,此时可以返回到原来阻塞的位置。

第二个:主线程执行到sync的时候阻塞主线程队列,将block添加到全局线程队列中,采用同步阻塞全局线程队列将最里面的block添加到主线程队列中,而此时主线程队列阻塞等待block的返回,而block则等待主线程队列执行完毕添加到主线程队列中,这样就死锁了。

GCD之死锁体会的更多相关文章

  1. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  2. GCD之死锁

    GCD相当好用,但用不好就会死锁,始终要记着这样一句秘籍: 不要在串行队列放dispatch_sync.dispatch_apply 下面看几个例子 1 2 3 4 5 6 7 8 9 10 11 1 ...

  3. iOS多线程——GCD与NSOperation总结

    很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不 ...

  4. GCD 容易让人迷惑的几个问题

    写在开头: 本文旨在阐述一些大家容易产生迷惑的GCD相关内容,如果是需要了解一些GCD概念或者基础用法,可以看看这两篇文章:GCD 扫盲篇.巧谈GCD . 目录: 迷惑一:队列和线程的关系 迷惑二:G ...

  5. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  6. 那些著名或非著名的iOS面试题-前编

    1.如何追踪app崩溃率,如何解决线上闪退 当iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈跟踪信息和 ...

  7. BAT面试的准备—iOS篇

    本文主要用于记录在准备BAT面试中关于iOS遇到的问题和做一些相关面试题的笔记 iOS网络层设计 1.网络层和业务层的对接设计 使用哪种交互模式来和业务层对接 : 使用Delegate为主,目的是为了 ...

  8. 多线程下载图片,滑动tableView崩溃--资源抢夺问题

    最近练习使用NSoperation模拟SDWebImage下载图片,发生了崩溃的问题,还专门写博客记录这件事情: http://www.cnblogs.com/tufei7/p/7074030.htm ...

  9. iOS知识点汇总

    1.怎样追踪app崩溃率.怎样解决线上闪退 当iOS设备上的App应用闪退时.操作系统会生成一个crash日志.保存在设备上.crash日志上有非常多实用的信息,比方每个正在运行线程的完整堆栈跟踪信息 ...

随机推荐

  1. multisim&proteus&protel比较

    Multisim有超强板级的模拟/数字电路板的设计工作.它包含了电路原理图的图形输入.电路硬件描述语言输入方式,具有丰富的仿真分析能力.高版本可 以进行单片机等MCU的仿真.Multisim有实际元器 ...

  2. atoi()函数(转载)

    atoi()函数 原型:int  atoi (const  char  *nptr) 用法:#include  <stdlib.h> 功能:将字符串转换成整型数:atoi()会扫描参数np ...

  3. Django创建应用、模型、配置后台自动管理

    1.创建应用 python manage.py startapp myblog 2.应用结构 3.创建模型(models.py) from django.db import models # Crea ...

  4. Spring Web MVC(三)之注解

    [toc] spring web mvc 基于注解的优化 我写的注解是按照spring web的部件分类写的,这样的话比较方便查看,大家感觉有用的话可以分享个别人,希望对对更多的人有帮助.毕竟零基础开 ...

  5. SpringMVC知识点小结

    SpringMVC: 1.SpringMVC和Spring的关系: 软件开发的三层架构: web层[表示层.表现层]---->Service层---->Dao[DataBase Acces ...

  6. Python有哪些高大上的项目?

    ​Python作为程序员的宠儿,得到了越来越多人的关注,使用Python进行应用程序开发的越来也多.那么,Python有哪些高大上的项目?这里有十个: 1.NuPIC 它是一个以HTM学习算法为工具的 ...

  7. CSS3动画效果之animation

    先解决上一篇的遗留问题. div { width: 300px; height: 200px; background-color: red; -webkit-animation: test1 2s; ...

  8. MongoDB学习之路(五)

    MongoDB $type 操作符 类型 数字 备注 Double 1 String 2 Object 3 Array 4 Binary data 5 Undefined 6 已废弃 Object i ...

  9. YYHS-怎样更有力气

    题目描述 OI大师抖儿在夺得银牌之后,顺利保送pku.这一天,抖儿问长者:"我虽然已经保送了,但我的志向是为国家健康工作五十年.请问我应该怎样变得更有力气?"  长者回答:&quo ...

  10. Beta阶段冲刺日志集合贴

    [Beta]Daily Scrum Meeting--Day1:http://www.cnblogs.com/RunningGuys/p/6890738.html [Beta]Daily Scrum ...