gpt4 book ai didi

swift - 修改一个新数组然后崩溃

转载 作者:搜寻专家 更新时间:2023-11-01 06:12:11 25 4
gpt4 key购买 nike

var list: [Int] = []
public func printListValues() {
DispatchQueue.global().async {
while true {
if self.list.count < 10 {
self.list.append(self.list.count)
} else {
self.list.removeAll()
}
}
}

DispatchQueue.global().async {
while true {
let newList = self.list
newList.forEach { debugPrint($0) }

}
}

}

我知道数组有时不是线程安全的。但是我做了let value = self.list。它也因信息而崩溃:

Thread 3: Fatal error: Index out of range

newList.forEach { debugPrint($0) } 行上。

为什么 newList 不安全。有什么问题?

最佳答案

数组操作不是原子的。当您在第二个线程中访问该数组时,您必须确保它不在第一个线程的 append() 或 removeAll() 操作的中间,否则您可能正在复制一个处于不确定状态的数组.类似地,这两个操作之一可能发生在阵列复制操作的中间,这会导致阵列在复制时更改状态的问题。您可以通过添加一些线程同步来修复您的代码。

var list: [Int] = []
var mutex = pthread_mutex_t()
public func printListValues() {
pthread_mutex_init(&mutex, nil)
DispatchQueue.global().async {
while true {
if self.list.count < 10 {
pthread_mutex_lock(&self.mutex)
self.list.append(self.list.count)
pthread_mutex_unlock(&self.mutex)
} else {
pthread_mutex_lock(&self.mutex)
self.list.removeAll()
pthread_mutex_unlock(&self.mutex)
}
}
}

DispatchQueue.global().async {
while true {
pthread_mutex_lock(&self.mutex)
let newList = self.list
pthread_mutex_unlock(&self.mutex)
newList.forEach { debugPrint($0) }
}
}
}

关于swift - 修改一个新数组然后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53596961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com