参考文章(这篇文章写的极其好,大家看就对了)
参考的GitHub地址
YSC-GCD-demo
就是上面这篇文章的代码Demo
关于死锁
- 首先一句话确定死锁发生的前提:在当前线程添加同步任务到当前线程的任务队列就会造成死锁
- 在区分几个定义:
- 线程可以比作公路,将东西从A运到B的时候可以走多条公路同时运,也就是异步+并发
- 那队列呢其实就是一个长条货车,上面运着许多货物(任务)
- 总结下就是,线程上跑队列,队列是任务的集合
- 非常难搞的一个点
- 同步执行 + 串行队列 = 不会死锁
- 在当前线程添加同步任务到当前线程的任务队列就会造成死锁,在添加串行队列的时候我们是在主队列里添加,而串行队列里的任务执行又是在新的串行队列里,到这里在好好分清楚上面是队列,什么是线程
- 同步执行 + 主队列 = 死锁
- 这个首先,我们dispatch是一个任务,要在主队列里执行,而这个想结束的前提就是将块里的任务执行完毕, 而不幸的是,块里任务不像上一个是在新的队列里执行,而是同样在主队列里执行,在他的全面还排着一个任务,要等他完成了才能继续,这就导致双方互相等待,造成死锁
- 同步执行 + 串行队列 = 不会死锁