https://github.com/xufeng79x/GCDDemo

1.简介

前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生了卡死现象。

本章节中将分析研究一下卡死线程发生的原理。

2.分析

[New learn]GCD的基本使用中我们可以看出,异步执行方式无论是何种队列,无论是否开启新线程都不会发生卡死现象。原因在于如果异步执行方式将任务放入队列后可以“忍受”等待,当线程资源不足的时候可以等待线程空闲后再来执行。所以说异步不会发生卡死现象。

那么唯一我们可以推断出来的是同步执行的情况下将会发生卡死。那么同步执行在和什么队列组合的时候会发生卡死呢?

定性分析一下:

2.1 同步执行和串行队列组合:

那么为什么【同步执行+自建串行队列】不会发生卡死,而【同步执行+主队列】会发生卡死,按理说,主队列也应该是一个串行队列,因为他只在主线程中执行,换句话说,主队列是并行队列是没有任何意义的。

按照我的分析【同步执行+自建串行队列】的执行方式如同:

唯一的执行线程在两个队列间串行执行任务。

而【同步执行+主队列】得执行方式如同:

而此时由于调度的是同一个队列,队列的性质决定他必须等待前任务执行完毕后才能去执行后续任务,这样导致产生一种死锁的现象的产生。

以上纯粹是个人YY。

下面我们来使用实际例子来查看一下自己的YY是否准确:

我们在controller中根线程都是主线程,队列是主队列,为了排除这种干扰,我们在设计测试代码的时候在某个线程中在开启子线程,两者的队列一样进行同步执行操作:

/**
 *  同步执行下的相同串行队列的卡死分析
 */
-(void) testForSyncAndSerial
{
    // 创建队列
    dispatch_queue_t queue = dispatch_queue_create("xf", DISPATCH_QUEUE_SERIAL);
    // 异步启动任务,他将在新的线程中执行,作为测试的根线程
    dispatch_async(queue,^{
        NSLog(@"execute task1 in thread : %@  start!" , [NSThread currentThread]);
        // 在当前线程中使用与根线程相同的串行队列进行新任务的同步执行
        dispatch_sync(queue,^{
            NSLog(@"execute task2 in thread : %@" , [NSThread currentThread]);
        });
        NSLog(@"execute task1 in thread : %@  end!", [NSThread currentThread]);
    });

    NSLog(@"%@", @"完成!");
}

结果:

-- :::] 完成!
-- :::] execute task1 , name = (null)}  start!

总结:

卡死现象发生!YY是正确的!!

当根线程(调度发起的线程)的串行队列与同步执行任务的串行队列为同一个队列的时候将会卡死。

那么如果换成并行队列会发生什么呢?

2.2 同步执行和并行队列组合:

按照之前分许,由于串行队列的性质决定了他必须等到前面的任务执行完毕后才能执行,所以可能会造成死锁现象,但是对于并行队列应该不会有此问题,我们加以测试:

/**
 *  同步执行下的相同串行队列的卡死分析
 */
-(void) testForSyncAndConcurrent
{
    // 创建队列
    dispatch_queue_t queue = dispatch_queue_create("xf", DISPATCH_QUEUE_CONCURRENT);
    // 异步启动任务,他将在新的线程中执行,作为测试的根线程
    dispatch_async(queue,^{
        NSLog(@"execute task1 in thread : %@  start!" , [NSThread currentThread]);
        // 在当前线程中使用与根线程相同的串行队列进行新任务的同步执行
        dispatch_sync(queue,^{
            NSLog(@"execute task2 in thread : %@" , [NSThread currentThread]);
        });
        NSLog(@"execute task1 in thread : %@  end!", [NSThread currentThread]);
    });

    NSLog(@"%@", @"完成!");
}

结果:

-- :::] 完成!
-- :::] execute task1 , name = (null)}  start!
-- :::] execute task2 , name = (null)}
-- :::] execute task1 , name = (null)}  end!

总结:

我们可以看到并行队列不会造成卡死现象,因为不会有死锁的条件产生。

3.总结

当根线程(调度发起的线程)的串行队列与同步执行任务的串行队列为同一个队列的时候将会卡死。

[New learn]GCD的卡死现象分析研究的更多相关文章

  1. [New learn]GCD的基本使用

    https://github.com/xufeng79x/GCDDemo 1.简介 介绍GCD的使用,介绍多种队列与同步异步多种情况下的组合运行情况. 2.基本使用步骤 如果使用GCD则一般也就两个步 ...

  2. Eclipse中jsp、js文件编辑时,卡死现象解决汇总

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...

  3. Eclipse编辑jsp、js文件时,经常出现卡死现象解决汇总

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...

  4. Eclipse编辑jsp、js文件时卡死现象的解决办法汇总

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...

  5. 解决Eclipse中的卡死现象

    解决Eclipse中的卡死现象 取消验证 windows–>perferences–>validation 把 除了manual 下面的全部点掉,build下只留 classpath de ...

  6. Eclipse中jsp、js文件编辑时,卡死现象解决汇总(转)

    使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下:   1.取消验证 win ...

  7. R语言重要数据集分析研究——需要整理分析阐明理念

    1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标 ...

  8. NLP+语篇分析(五)︱中文语篇分析研究现状(CIPS2016)

    摘录自:CIPS2016 中文信息处理报告<第三章 语篇分析研究进展.现状及趋势>P21 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebo ...

  9. Methods for follow-up research of exome analysis:外显子后续分析研究思路总结

    外显子后续分析研究思路一般有以下几种(Methods for follow-up research of exome analysis): 1.对突变频率.突变类型.突变方式进行统计分析 Mutati ...

随机推荐

  1. FTP-成型版本

    1. 旧知识回顾-反射 hasattr(object, name) 说明:判断对象object是否包含名为name的属性(方法) 测试代码如下: class tt(object): def __ini ...

  2. [洛谷P5057][CQOI2006]简单题

    题目大意:有一个长度为$n$的$01$串,两个操作: $1\;l\;r:$把区间$[l,r]$翻转($0->1,1->0$) $2\;p:$求第$p$位是什么 题解:维护前缀异或和,树状数 ...

  3. hihoCoder#1698 : 假期计划 组合数

    题面:hihoCoder#1698 : 假期计划  组合数 题解: 题目要求是有序的排列,因此我们可以在一开始就乘上A!*B!然后在把这个序列划分成很多段. 这样的话由于乘了阶乘,所以所有排列我们都已 ...

  4. [LNOI] 相逢是问候 || 扩展欧拉函数+线段树

    原题为2017六省联考的D1T3 给出一个序列,m次操作,模数p和参数c 操作分为两种: 1.将[l,r]区间内的每个数x变为\(c^x\) 2.求[l,r]区间内数的和%p 首先,我们要了解一些数论 ...

  5. Linux进程间通信简介

    本人仅做简介.转自:http://www.linuxidc.com/Linux/2013-06/85904p2.htm   管道( pipe ):   (Linux进程间通信) 管道是一种半双工的通信 ...

  6. BZOJ1912 APIO2010 洛谷P3629 巡逻

    Description: 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任 ...

  7. 【DP】【P2340】奶牛会展

    传送门 Description 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行了面试,确定了每头奶牛的智商和情商. 贝西有权选择让哪些奶牛参加展览.由于负的智商或 ...

  8. jdbcType和javaType

    MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL VARCHAR BINARY BLOB NV ...

  9. [mysql]修改表段默认值

    alter table xxx alter location drop default; alter table xxx alter location set default "xxx&qu ...

  10. HDU1254 bfs

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...