死锁

死锁产生的原因

在串行队列执行任务的线程向这个串行队列提交一个同步任务。

因为同步任务会阻塞当前线程,线程被阻塞了,提交的任务就不能被执行,形成相互等待的局面,所以产生死锁。

解决方法

知道了引起死锁的原因,解决方法就有了:

  1. 在主线程中,不要向主队列提交同步任务。
  2. 在其他线程,向队列提交同步任务时,注意当前线程是不是这个串行队列执行任务的线程。

情景再现

常见的主队列死锁现象

1
2
3
4
5
6
7
8
dispatch_queue_t queue = dispatch_get_main_queue();

// 此处所在线程是主队列执行任务的主线程
dispatch_sync(queue, ^{
NSLog(@"2. %@", NSThread.currentThread);
});

NSLog(@"3. %@", NSThread.currentThread);

自定义串行队列的死锁现象

1
2
3
4
5
6
7
8
9
10
11
dispatch_queue_t queue = dispatch_queue_create("com.struggleblog.serial", DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue, ^{
NSLog(@"2. %@", NSThread.currentThread);
// 此处所在线程是串行队列 Queue 执行任务的线程
dispatch_sync(queue, ^{
NSLog(@"4. %@", NSThread.currentThread);
});
});

NSLog(@"3. %@", NSThread.currentThread);