Q: 什么情况下会产生死锁?
A: 使用sync函数往当前的串行队列添加任务,会造成当前串行队列的死锁(互相等待)
sync的特性: 必须执行完当前任务才能往下走
串行队列的特性: 需要当前任务执行完成才能进行下一个任务
两个特性的结合就造成了死锁
dispatch_semaphore
信号量,可以理解为通道数量
dispatch_semphore_creats(num)
进行初始化,可以初始化最大通道数量(最大并发量)
// 初始化最大并发量为 5
dispatch_semphore_creats(5)
dispatch_semaphore_wait
执行 dispatch_semaphore_wait
操作,这个函数将信号量池中可用数量-1, 当剩余可并发数 < 0的时候,会进入等待操作,等待信号量池中可用并发数量> 0 代码在继续执行
- 打个比方, 就好比车库通车, 目前车库有5个空位
dispatch_semphore_creats(5)
,第一辆车进来(线程执行代码)车库共有5个车位, 停一辆车 车位就减少一个, 当来了第6辆车的时候,只能在门口等待车库里有车走了之后才能在停入车库
// dsema, 传入信号量对象
// timeout, 超时时间
dispatch_semaphore_wait(dispatch_semaphore_t _Nonnull dsema, dispatch_time_t timeout)
dispatch_semaphore_signal
执行dispatch_semaphore_signal
会将当前可并发数+1,如果之前可并发数 <0 ,会激活等待中的线程,让其运行起来
- 还是用车库举例, 车库里停着的车现在出去了,车库又有空位了,可以在新来一辆车停入
dispatch_semaphore_signal(dispatch_semaphore_t _Nonnull dsema)