Операции с массивами не являются атомарными.Когда вы обращаетесь к массиву во втором потоке, вы должны быть уверены, что он не находится в середине операции 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) }
}
}
}