死锁
死锁产生的原因
在串行队列执行任务的线程向这个串行队列提交一个同步任务。
因为同步任务会阻塞当前线程,线程被阻塞了,提交的任务就不能被执行,形成相互等待的局面,所以产生死锁。
解决方法
知道了引起死锁的原因,解决方法就有了:
- 在主线程中,不要向主队列提交同步任务。
- 在其他线程,向队列提交同步任务时,注意当前线程是不是这个串行队列执行任务的线程。
情景再现
常见的主队列死锁现象
dispatch_queue_t queue = dispatch_get_main_queue();
// 此处所在线程是主队列执行任务的主线程
dispatch_sync(queue, ^{
NSLog(@"2. %@", NSThread.currentThread);
});
NSLog(@"3. %@", NSThread.currentThread);
自定义串行队列的死锁现象
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);