iOS多线程开发之GCD(死锁篇)
上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题。有兴趣的朋友可以回顾《 iOS多线程开发之GCD(上篇) 》和《 iOS多线程开发之GCD(中篇) 》。 言归正传,我们首先来回顾下死锁,所谓死锁: 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源(如数据源,内存等,变量不是资源)而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去。 死锁形成的原因: 系统资源不足 进程(线程)推进的顺序不恰当; 资源分配不当 死锁形成的条件: 互斥条件: 所谓互斥就是进程在某一时间内独占资源。 请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件: 进程已获得资源,在末使用完之前,不能强行剥夺。 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。 在GCD中,主要的死锁就是当前串行队列里面同步执行当前串行队列。解决的方法就是将同步的串行队列放到另外一个线程执行。 在举例说明之前,我们先来回顾下GCD的中的任务派发和队列。 (1)任务派发 任务派发方式 说明 dispatch_sync() 同步执行,完成了它预定的任务后才返回,阻塞当前线程 dispatch_async() 异步执行,会立即返回,预定的任务会完成但不会等它完成,不阻塞当前线程 (2)队列种类 队列种类 说明 串行队列