什么是 GCD 锁死问题
在向当前串行队列
里面添加同步(sync)执行
任务,会产生死锁卡住当前线程。
例如:在一个队列中,存在两个任务,分别是 A 和 B,然后 A 等待 B 执行完成,B 有等待 A 的完成,这样相互等待就造成了锁死,程序就会崩溃:Thread 3: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
案例一
print("执行了 任务 1")
DispatchQueue.main.sync {
print("执行了 任务 2")
}
print("执行了 任务 3")
上面的代码在主线程队列中执行,任务2同步执行,这里就会线程阻塞,然后任务2加入到主线程队列任务3后面,这里任务3会等待任务2的结束,任务2又排在任务3 的后面等待任务3的完成,这样就造成了锁死。
队列示意图:
[任务1] <- (同步线程【执行任务2】) <- [任务3] <- [任务2]
DispatchQueue.main.sync 同步执行会将任务加到队列最后一个执行,也就是任务3后面
案例二
// 默认是串行队列,并行队列需要添加 attributes 参数 .concurrent
let queue = DispatchQueue(label: "queue.com");
print("初始任务")
queue.async {
queue.sync {
print("执行了 A")
}
queue.sync {
print("执行了 B")
}
print("执行了 C")
}
原理和上面的一样
网友评论