我发现这会产生死锁,但我不知道为什么。基本上,我在一个类中有一个队列,并且每次应该更改类的状态时,我都会在队列中将该任务作为同步任务运行:
private var serialQueue = DispatchQueue(label: "my_mutex_queue")
func changeState() {
serialQueue.sync {
// perform change
}
}
状态的某些更改需要调用委托。在这种情况下,无法同步调用该任务,因为它将导致死锁。但是,异步调度也会导致死锁(我们仍然在队列“ my_mutex_queue”中的同步任务“ changeState”中):
func notifyDelegate() {
serialQueue.async {
// notify delegate
}
}
如果我将委托通知作为异步任务运行在另一个队列中,那么一切都会按预期进行。在Apple文档中找不到关于为何在同一队列中调用异步任务会导致死锁的注释。
您无法serialQueue.sync
从所执行的程序段中调用serialQueue
。
TL; DR;
我认为这可能正在发生:
serialQueue.async
的notifyDelegate
。changeState
错误地假设当前线程不是的线程,从而调用serialQueue
。changeState
方法serialQueue
的调用堆栈上,您同步调度另一个serialQueue.sync
无法启动的块B ,因为您等待它在当前由A进行的先前异步调度的块A中启动serialQueue
。避免这种情况的方法:
或者
os_unfair_lock
或NSLock
或NSRecursiveLock
代替。它还可能会提高性能。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句