在并发队列中调用sync会导致死锁吗?

问题描述 投票:0回答:1

我知道在串行队列中调用同步会导致死锁,例如

let serialQueue = DispatchQueue(label: "serialQueue")
serialQueue.async {
    serialQueue.sync {
        // deadlock
    }
}

但是如果我写这样的东西怎么办:

let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
concurrentQueue.async {
    concurrentQueue.sync {
        // deadlock?
    }
}

是的,一般不会出现任何僵局。因为我们的同步任务只是在不同的线程上运行。 但是,是否会从同步任务的线程池中返回分配了异步任务的同一线程?如果是这样,可能会导致线程卡住,我们就会陷入死锁

swift multithreading grand-central-dispatch
1个回答
0
投票

你问:

但是,同步任务的线程池中是否会返回分配了异步任务的同一线程?如果是这样,可能会导致线程卡住,我们就会陷入死锁。

不,它不会因此而陷入僵局。

话虽如此,并发队列由于多种其他原因很容易出现死锁:它可能在线程爆炸场景中发生死锁(因为工作线程池仅限于 64 个线程)和/或滥用锁、屏障,

wait
在信号量/组、目标队列等上。但它不会仅仅因为它尝试使用“同一线程”而死锁。

不用说,无论如何,最好避免这种同步调度到自身的做法。

© www.soinside.com 2019 - 2024. All rights reserved.