Ios 的gcd 多线程,为什么在主队列添加同步任务会线程崩溃?而不是先去执行任务方法先,再回到之

Ios的gcd多线程,为什么在主队列添加同步任务会线程崩溃?而不是先去执行任务方法先,再回到之前的位置继续执行代码呢?添加异步任务不会线程崩溃,会在viewdidload... Ios 的gcd 多线程,为什么在主队列添加同步任务会线程崩溃?而不是先去执行任务方法先,再回到之前的位置继续执行代码呢?添加异步任务不会线程崩溃,会在view did load 运行之后再去执行任务。 展开
 我来答
为什么xkk
推荐于2018-05-17 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:296
采纳率:100%
帮助的人:61.2万
展开全部
主队列添加同步任务会导致死锁,示例如下:
NSLog(@"任务1");
dispatch_sync(dispatch_get_main_queue(),^{
NSLog(@"任务2");

});
NSLog(@"任务3");
运行结果:只打印出“任务1”
执行步骤是:
1.任务1肯定会执行;
2.然后遇到了dispatch_sync,这是一个同步线程,同步线程会阻塞当前线程,必须等同步线程中的任务(任务2)执行完毕之后才会执行下一个任务(任务3),这时候会进入等待状态(等任务2执行完成并返回);
3.dispatch_get_main_queue()是一个主队列,有任务来(任务3)就要加进去,而这时任务2处于等待中,所以就会先加入任务3,之后任务2就排在了任务3的后面。
4.这样就造成了这么一种状态:
dispatch_sync说:我是同步的,必须要等我的任务(任务2)执行完再执行其他任务(任务3);任务2--->任务3

dispatch_get_main_queue()说:我是一个主队列,有人来我就要让他排队,谁先排队谁先执行(FIFO),任务2还没过来,所以任务3来了之后我就让他先排队,等任务2来了让它排在任务3后面再执行;任务3--->任务2
这就导致任务3在等任务2执行、任务2在等任务3执行,结果谁都执行不了。
QunZhuZi
2016-09-26 · TA获得超过402个赞
知道小有建树答主
回答量:247
采纳率:0%
帮助的人:59.8万
展开全部
//////

NSLog(@"1"); // 任务1

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"2"); // 任务2

});

NSLog(@"3"); // 任务3
//////
你可以打印一下上述代码

结论是 你只能打印出1
因为 2 和 3 形成死锁 直接挂了

(1)任务 1和 gcd同步线程 和 任务 3 同在 主队列中 ,进队列顺序 1 gcd 3

(2)gcd 为同步线程 还是在主队列中 FIFO原则 任务2 又在 任务3之后

所以 2在等3完成 3 在等2 完成 就死锁了

所以 dispatch_get_main_queue(), 要改成 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) 就对了 执行顺序 为 1 2 3

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhouf369
2015-09-01
知道答主
回答量:3
采纳率:0%
帮助的人:3726
展开全部
dispatch_sync方法不能在主队列中调用,因为这会无限期的阻止线程并会导致你的应用死锁。所有通过GCD提交到主队列的任务必须是异步的。

参考:
http://blog.csdn.net/chaoyuan899/article/details/12554603
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式