IOS-GCD一种死锁情况分析

问题分析:主线程执行下面方法,这种情况为什么会死锁?

-(void)viewDidLoad

{

dispatch_sync(dispatch_get_main_queue(),block());

}

1.理解dispatch_sync dispatch_async 的工作流程

dispatch_sync(queue,block) 做了两件事:

1)将block添加到queue队列中

2)阻塞调用线程,等待block()执行结束,回到调用线程。

dispatch_async(queue,block) 做了两件事

1)将block添加到queue队列;

2)直接回到调用线程(不阻塞调用线程)。

2.当在main_thread中调用dispatch_sync 时:

1)main_thread被阻塞,无法继续执行;

2)同步派发sync导致block()需要在main_thread中执行结束才回返回;

3)而此时main_thread被阻塞,二者相互等待,死锁。

所以:不要讲block同步派发到调用gcd所在线程的关联队列中。

其他的queue也是类似的,把当前正在执行的queue阻塞,还想要在那个queue执行代码,就会死锁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录(GCD): 关键词 混淆点 场景应用 总结 1. 关键词 线程概念: 独立执行的代码段,一个线程同时间只能执...
    Ryan___阅读 5,042评论 0 3
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 7,784评论 1 17
  • iOS中GCD的使用小结 作者dullgrass 2015.11.20 09:41*字数 4996阅读 20199...
    DanDanC阅读 4,489评论 0 0
  • 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列...
    有梦想的老伯伯阅读 4,612评论 0 4
  • 记得当年离开 路上你来电话 说要和我私奔 把你留在原地 火车开往北方 不见你的身影 我洒一路热泪 过了这么多年 眼...
    林嘉梓阅读 3,529评论 33 41