iOS 底层探索篇 —— GCD 源码分析

1. 死锁

所谓死锁,通常指有两个线程A和B都卡住了无法完成,都在等待对方完成任务后在执行。A不能完成是因为它在等待B完成。但B也不能完成,因为它在等待A完成。于是大家都无法完成任务,就导致了死锁(DeadLock)。

2 同步/异步函数

同步,异步区别

  1. 能否开辟新线程
  2. 任务回调是否具备异步性 - 同步性
  3. 死锁情况的产生

2.1 同步函数

下面分析串行和并行执行同步函数的情况。

串行

上文说到同步函数实现会走到这里,这里看到dq_width == 1的时候,也就是当是串行队列的时候,会调用_dispatch_barrier_sync_f
在这里插入图片描述
搜索_dispatch_barrier_sync_f。发现调用了_dispatch_barrier_sync_f_inline
在这里插入图片描述
搜索_dispatch_barrier_sync_f_inline。
在这里插入图片描述
当死锁的时候,都会调用_dispatch_sync_f_slow,所以这里需要看_dispatch_sync_f_slow。这里也可以知道_dispatch_sync_f_slow不报错,报错的是 __DISPATCH_WAIT_FOR_QUEUE__
在这里插入图片描述
进去_dispatch_sync_f_slow。
在这里插入图片描述
接下来看报错的地方,也就是__DISPATCH_WAIT_FOR_QUEUE__,看到其报错的地方有条件判断,那么就进去看是如何判断是死锁的。这里的2个参数一个是线程状态,一个是线程id。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里做了中间层封装,实际调用_dispatch_lock_is_locked_by
在这里插入图片描述
点进去_dispatch_lock_is_locked_by。DLOCK_OWNER_MASK是个很大的值,只要(lock_value ^ tid) 不为空,那么与上DLOCK_OWNER_MASK就不会为0。如果(lock_value ^ tid) & DLOCK_OWNER_MASK为0,那么就代表着(lock_value ^ tid)为0,那么就说明lock_value等于tid。那么就说明,本来是要调起这个队列,但是这个队列原定是要等待的,构成了一个矛盾,所以发生了死锁

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值