我知道在串行队列中调用同步会导致死锁,例如
let serialQueue = DispatchQueue(label: "serialQueue")
serialQueue.async {
serialQueue.sync {
// deadlock
}
}
但是如果我写这样的东西怎么办:
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
concurrentQueue.async {
concurrentQueue.sync {
// deadlock?
}
}
是的,一般不会出现任何僵局。因为我们的同步任务只是在不同的线程上运行。 但是,是否会从同步任务的线程池中返回分配了异步任务的同一线程?如果是这样,可能会导致线程卡住,我们就会陷入死锁
你问:
但是,同步任务的线程池中是否会返回分配了异步任务的同一线程?如果是这样,可能会导致线程卡住,我们就会陷入死锁。
不,它不会因此而陷入僵局。
话虽如此,并发队列由于多种其他原因很容易出现死锁:它可能在线程爆炸场景中发生死锁(因为工作线程池仅限于 64 个线程)和/或滥用锁、屏障,
wait
在信号量/组、目标队列等上。但它不会仅仅因为它尝试使用“同一线程”而死锁。
不用说,无论如何,最好避免这种同步调度到自身的做法。