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执行代码,就会死锁。

你可能感兴趣的:(IOS-GCD一种死锁情况分析)