我看到以下代码(在 Playground 上运行)出现了奇怪的行为。
import Foundation
let count = 100
var array = [[Int]](repeating:[Int](), count:count)
DispatchQueue.concurrentPerform(iterations: count) { (i) in
array[i] = Array(i..<i+count)
}
// Evaluation
for (i,value) in array.enumerated() {
if (value.count != count) {
print(i, value.count)
}
}
结果每次都不同,有时会因内存损坏而崩溃。当另一个线程正在访问内存时,看起来正在发生内存重新分配(“数组”)。
这是(iOS 的)错误还是预期的行为?我错过了什么吗?
最佳答案
这是预期的行为。 Swift 数组不是线程安全的;也就是说,同时从多个线程修改 Swift 数组会导致损坏。
我意识到你只是在试验,但即使数组是线程安全的,这也不能很好地使用 concurrentPerform
并且可能比简单的 for
表现更差给定线程开销的循环。
一旦你引入了适当的同步方法来保护数组更新,例如将该更新调度到串行调度队列,它肯定会比简单的 for
执行得更慢。环形
关于ios - DispatchQueue.concurrentPerform 内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53346985/