dispatch_sync死锁问题分析

示例代码

1
2
3
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"11111");
});

在按钮的响应事件中执行如下代码,会造成死锁,简单分析一下死锁的原因:

dispatch_sync 是同步执行,该方法会阻塞线程,等到block内容执行完之后,其后面的代码才有机会执行。

如上代码,dispatch_sync将block任务提交到主队列中,等待执行。

我们知道,主队列是一个串行队列,串行队列的特点是先进先出。对于iOS而言,主队列有很多任务要执行,基本没有可能当你执行上面代码的时候,主队列中没有任何任务。

假设,执行到上述代码的时候,主队列里有3个待执行任务,这时将第四个任务(也就是上述代码的Block),提交到主队列。这时候,主队列中有四个任务,主队列要先执行前三个任务,才能执行第四个任务,但是dispatch_sync阻塞函数,主队列要先执行完第四个任务,主队列才有时机去执行前三个任务。所以代码处于死锁状态。