iOS GCD 同步和异步

iOS GCD Sync and Async

我试图弄清楚同步和异步方法在 GCD 中是如何工作的,但我做了一些测试但并不真正理解结果。这是来自 Playground

的代码
PlaygroundPage.current.needsIndefiniteExecution = true

let queueA = DispatchQueue(label: "my-awesome-queue")
let queueB = DispatchQueue(label: "one-more-awesome-queue", attributes: .concurrent)

for _ in 0...5 {
    queueA.sync {
        Thread.sleep(forTimeInterval: 0.2)
        print("")
    }
}

for _ in 0...5 {
    queueB.async {
        Thread.sleep(forTimeInterval: 0.2)
        print("")
    }
}

结果是













我不太明白,为什么queueA会阻塞来自其他队列(queueB)的异步任务?我认为不同的队列可以从不同的线程执行,并且 运行 同步队列和不同的异步队列同时执行没有问题。或者自定义同步队列阻塞任何其他队列(甚至主队列)?

基本上从主线程使用sync总是错误的,因为现在你阻塞了主线程。而这正是你正在做的!只有后台线程应该 sync 到另一个线程。

and there are no problems to run sync queue and different async queue simultaneously

是的,有。没有什么可以“同时”发生。凡事都要“轮流”。

Or custom sync queues block any other queues (even main queue)?

是的。当使用 sync 调用队列 A 并且正在休眠时,调用线程(在您的代码中是主线程)被阻塞。你不允许事情“轮流”。我们无法继续进行队列 B 调用,因为我们被困在队列 A 调用中。

您还会注意到队列 B 结果的到达速度比队列 A 结果快得多。这是因为队列 B 是用 async 调用的并且是并发的,所以整个第二个循环在运行时立即运行,执行所有循环,因此所有结果一起到达。如果将 Date().timeIntervalSince1970 与输出一起打印,这一点会更加明显。