判断是否死锁 终极方法是判断
死锁问题产生的根源是dispatch_sync 是否是发生在当前dispatch_sync代码上下文是否是同一个线程
也就是dispatch_sync 阻塞的是否是dispatch_sync代码上下文所在的线程
比如当前我代码执行所在的是A线程,然后我做同步A现成操作 必定会死锁
但是如果我在A线程中 做同步B线程操作是不会造成死锁的
第一种情况
image.png
首先任务1 实在主线程中执行的 我同步操作 dispatch_get_main_quene()获取到的是一个主队列,主队列有个特性就是 一定会执行在主线程中,这样我阻塞的就是主线程。这样就死锁了。
image.png第二种情况 首先有个概念 dispatch_get_global_quene 或者是 dispatch_quene_create来创建的队列 都是有特定的线程去做执行操作
image.png
也就是说肯定不是在主线程中执行的
再分析一下上面的代码,任务1是在主线程中执行的。任务3也是主线程。但是任务2在一个独立的线程去执行,也就是阻塞的是一个分支线程,这样就不会产生阻塞。
再来分析一下 上面这种情况 async是不会产生死锁的。然后1 跟 5是可以正常输出的。不过由于是异步的 所以2跟5的输出顺序是不一定的。注意:假设quene所在的线程是A,任务3处 做的同步操作 就是阻塞的线程A,这样就死锁了。
image.png这种情况 也是同样的逻辑思路
任务1是在主线程中执行的,1 跟 5是可以正常执行的。2也可以正常输出。由于在任务2处是在一个独立的线程,这时候再去同步住队列所在的主线程,这样不会出现问题 因为同步操作内的block跟 同步操作所在的上下文是不在同一个线程中的
网友评论