【发布时间】:2019-07-12 06:41:29
【问题描述】:
我最近一直在学习线程和 DispatchQueues,并且遇到了一个大问题。我多次听说 GCD不保证给定的工作块可以在哪个线程上执行。大多数时候,这是一个有用的层次抽象。但是,我遇到了一个我仍然不知道原因的错误,但这让我意识到在我看来 GCD 这方面的潜在缺陷是什么。
例子:
let queue1 = DispatchQueue(label: "one")
let queue2 = DispatchQueue(label: "two")
queue1.sync {
let importantValue1 = "importantValue1"
let importantValue2 = queue2.sync {
return "importantValue2"
}
print("did important work, got values", importantValue1, importantValue2)
}
我的问题是,我是否至少可以保证我的队列不会在同一个线程上执行?从我所见,我似乎没有这个保证。但是,没有它,我不是一直处于僵局的危险之中吗?在上面的例子中,如果两个队列都在线程 7 上执行会发生什么?调用queue2.sync 不会导致应用崩溃吗?
【问题讨论】:
-
就像 Rob N 说的,当你使用
sync时,作为优化 GCD 会尽可能在当前线程上运行它。如果你使用async,你会发现它很可能会出现在另一个线程上。最重要的是,不,您不会一直处于僵局的危险之中。使用你这里的模式,它肯定不会死锁,但它会很聪明地使用最好的可用工作线程,如果可以的话避免上下文切换。
标签: swift concurrency grand-central-dispatch deadlock dispatch-queue