ios - DispatchQueue.concurrentPerform 内存损坏

标签 ios multithreading

我看到以下代码(在 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/

相关文章:

ios - 如何将 ios "more"按钮的文本更改为我的语言版本?

ios - OpenGL ES GLKBaseEffect 与更改顶点位置

c++ - 如何更改 boost 线程限制?

multithreading - 多线程Redis Cluster

iphone - UIButton点击传递参数?

iphone - 何时向用户收取应用内购买费用?

c++ - qt中的线程同步

c - malloc mongoose webserver http post body 并将其传递给线程

c# - 上下文切换死锁

ios - iOS 如何自动检测网络打印机