[New learn]GCD的卡死现象分析研究
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的卡死现象分析研究的更多相关文章
- [New learn]GCD的基本使用
https://github.com/xufeng79x/GCDDemo 1.简介 介绍GCD的使用,介绍多种队列与同步异步多种情况下的组合运行情况. 2.基本使用步骤 如果使用GCD则一般也就两个步 ...
- Eclipse中jsp、js文件编辑时,卡死现象解决汇总
使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...
- Eclipse编辑jsp、js文件时,经常出现卡死现象解决汇总
使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...
- Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 windo ...
- 解决Eclipse中的卡死现象
解决Eclipse中的卡死现象 取消验证 windows–>perferences–>validation 把 除了manual 下面的全部点掉,build下只留 classpath de ...
- Eclipse中jsp、js文件编辑时,卡死现象解决汇总(转)
使用Eclipse编辑jsp.js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲.将所有用过的方法罗列如下: 1.取消验证 win ...
- R语言重要数据集分析研究——需要整理分析阐明理念
1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标 ...
- NLP+语篇分析(五)︱中文语篇分析研究现状(CIPS2016)
摘录自:CIPS2016 中文信息处理报告<第三章 语篇分析研究进展.现状及趋势>P21 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebo ...
- Methods for follow-up research of exome analysis:外显子后续分析研究思路总结
外显子后续分析研究思路一般有以下几种(Methods for follow-up research of exome analysis): 1.对突变频率.突变类型.突变方式进行统计分析 Mutati ...
随机推荐
- hdu6184 Counting Stars 【三元环计数】
题目链接 hdu6184 题解 题意是让我们找出所有的这样的图形: 我们只需要求出每条边分别在多少个三元环中,记为\(x\),再然后以该点为中心的图形数就是\({x \choose 2}\) 所以我们 ...
- POJ. 1005 I Think I Need a Houseboat(水 )
POJ. 1005 I Think I Need a Houseboat(水 ) 代码总览 #include <cstdio> #include <cstring> #incl ...
- bzoj4300: 绝世好题(DP)
按位DP f[i]表示第i位为1的最长子序列 #include<iostream> #include<cstring> #include<cstdlib> #inc ...
- 【状压DP】【UVA11795】 Mega Man's Mission
传送门 Description 你要杀n个怪,每杀掉一个怪那个怪会掉落一种武器,这种武器可以杀死特定的怪.游戏初始你有一把武器,能杀死一些怪物.每次只能杀一只,求有多少种杀怪方法. Input 多组数 ...
- 一种高效的寻路算法 - B*寻路算法
在此把这个算法称作B* 寻路算法(Branch Star 分支寻路算法,且与A*对应),本算法适用于游戏中怪物的自动寻路,其效率远远超过A*算法,经过测试,效率是普通A*算法的几十上百倍. 通过引入该 ...
- udhcpd源码分析2--读取配置文件
1:重要的结构体 读取配置文件信息到全局的结构体struct server_config_t server_config中,这个结构在很多文件中都有引用到很重要. /* dhcpd.h */ stru ...
- python读书笔记-《简明python教程》上
1月15日 <简明python教程>上 基本结构: 基础概念+控制流+函数+模块+数据结构+面向对象+I/O+异常+标准库+其他 1.概念 1-0 退出python linux: ...
- a标签nest问题,即a标签里面嵌套a标签
方法一:使用div模拟a,监听click事件 方法二:使用<object>标签包裹内部a标签 <div style="width: 200px;height: 200px; ...
- DataGridView导出到Word
#region 使用Interop.Word.dll将DataGridView导出到Word /// <summary> /// 使用Interop.Word.dll将DataGridVi ...
- HDU1164
//HDU 1164 //输入一个数(1<x<=65535) 转化为素数的乘积() #include "iostream" #include "cstdio& ...