【发布时间】:2021-06-01 13:50:35
【问题描述】:
我在操场上有这段代码
import PlaygroundSupport
import Foundation
PlaygroundPage.current.needsIndefiniteExecution = true
let queue = DispatchQueue(label: "Barrier Test", attributes: .concurrent)
func syncProcess(index: Int) {
queue.sync {
print("Sync \(index) Called!")
}
}
func asyncBarrier(index: Int) {
queue.async(flags: .barrier) {
print("Async Barrier \(index) Called!")
}
}
for i in 0...1000 {
DispatchQueue.global().async {
asyncBarrier(index: i)
}
DispatchQueue.global().async {
syncProcess(index: i)
}
}
这是输出:
Async Barrier 0 Called!
Sync 0 Called!
但是当我尝试将迭代次数从 1000 减少到更小的值(即 10)时,它可以正常工作
Async Barrier 0 Called!
Sync 0 Called!
Async Barrier 1 Called!
Sync 1 Called!
Async Barrier 2 Called!
Sync 2 Called!
Async Barrier 3 Called!
Sync 3 Called!
Async Barrier 4 Called!
Sync 4 Called!
Async Barrier 5 Called!
Sync 5 Called!
Async Barrier 6 Called!
Sync 6 Called!
Async Barrier 7 Called!
Sync 7 Called!
Async Barrier 8 Called!
Sync 8 Called!
Sync 9 Called!
Async Barrier 9 Called!
Async Barrier 10 Called!
Sync 10 Called!
我只是想知道,发生了什么?
如果我将 asyncBarrier 更改为 syncBarrier,即使我使用了 1000 次迭代,它也能正常工作。
AFAIK,asyncBarrier 和 syncBarrier 之间的唯一区别是它是否会阻塞其调用者线程。
有人可以解释这种行为吗?
【问题讨论】:
-
竞态条件,堆积线程?
标签: swift asynchronous synchronous barrier dispatch-queue