Swift - 如何防止 DispatchQueues 在同一线程上执行?

标签 swift concurrency grand-central-dispatch deadlock dispatch-queue

我最近学习了很多关于线程和 DispatchQueues 的知识,并遇到了一个大问题。我多次听说 GCD 不保证给定的工作 block 可以在哪个线程上执行。大多数时候,这是一个有用的级别抽象。然而,我遇到了一个错误,我仍然不知道其原因,但它让我意识到在我看来 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 不会导致应用崩溃吗?

最佳答案

后台队列中的任务永远不会阻止后台队列中其他任务的运行,因此虽然可能会出现死锁,但在同一线程上执行的队列不会导致死锁。

另一方面,在另一个队列上同步运行代码是毫无意义的。

关于Swift - 如何防止 DispatchQueues 在同一线程上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54754761/

相关文章:

c++ - io_service::run() 的专用线程

ios - 用户在执行 dispatch_get_main_queue() 之前离开了当前 View

ios - 确定内容是否可滚动的属性(如果启用则不能)

Java并发日志记录到文件

java - 同步与锁定

ios - 串行队列上的 dispatch_async 和 dispatch_sync 之间的区别?

ios - 在后台获取核心数据对象 : objects not faulted

position - SKSpriteNode 上的 CGPoint x 无法正常工作(一半节点超出屏幕)

ios - 在 swift 2 中从 google drive 流式传输视频

ios - 如何让 Firebase 添加新用户而不覆盖当前用户(iOS、Xcode 8)?