Этого не может быть на детской площадке.Попробуйте запустить его в реальном приложении.
Единственный способ, которым два потока могут мешать друг другу, - это если один поток читает значение val
между временем, в течение которого другой поток читает значение и увеличивает его.Вам, скорее всего, просто повезло, так как время между чтением val
и записью его с увеличенным значением действительно крошечно.Разделите чтение и запись и введите задержку (с usleep
), и вы увидите условие гонки:
let queue = DispatchQueue(label: "my-queue", qos: .userInitiated, attributes: [.concurrent, .initiallyInactive])
var val = 0
let group = DispatchGroup()
group.enter()
queue.async {
for _ in 0..<100 {
let value = val
usleep(10_000)
val = value + 1
print("val = \(val)")
}
group.leave()
}
group.enter()
queue.async {
for _ in 0..<100 {
let value = val
usleep(9_000)
val = value + 1
print("val = \(val)")
}
group.leave()
}
queue.activate()