Swift - асинхронные задачи и освобождаемый указатель не выделялись

У меня простая проблема с проверкой и установкой элементов в массиве, но я хочу сделать это в задачах Async несколькими потоками.

        override func viewDidLoad() {
          super.viewDidLoad()
          test()
        }


        let group_dis = DispatchGroup()
        var sum : [Int] = [Int] (repeating: 0, count: 10_000)
        func test() {
            self.group_dis.enter()
            f1(str: "thread 1", min: 0, max: 5000)

            self.group_dis.enter()
            f1(str: "thread 2", min: 100, max: 2699)

            self.group_dis.enter()
            f1(str: "thread 3", min: 5301, max: 9999)

            self.group_dis.wait()
            print(self.sum)
        }
        func f1(str: String, min : Int,  max : Int) {
            let q = DispatchQueue.global(qos: .userInteractive)
            q.async {
                print("running ..... \(str) ")
                for i in min..<max {
                    if (self.sum[i] < i) {
                        self.sum[i] = i
                    }
                }
                self.group_dis.leave()
            }
        }

Ошибки: TestDispatchQueueGroup (67208,0x700000c2c000) malloc: * ошибка объекта 0x7fb4e1022800: освобождаемый указатель не был выделен TestDispatchQueueGroup (67208,0x700000c2c000) malloc: * устанавливает точку останова в malloc_error_break для отладки

Я знаю, что он разбился из-за конфликтов при доступе к ячейкам памяти в нескольких потоках. Но это тестирование, в моем большом проекте я пытаюсь найти решение для выполнения параллельных задач в одном массиве.

Спасибо за любые предложения.

enter image description here

Массивы Swift не являются потокобезопасными. Вам нужно убедиться, что только один поток может обновлять массив за раз. Один из способов сделать это - синхронно отправлять все обновления вашего массива в выделенную очередь последовательной отправки.

Paulw11 26.10.2018 08:43

@ Paulw11. Мне нужно сократить время обработки, поэтому я хочу выполнить параллелизм. Может и нет.

Tuan Huynh 26.10.2018 08:48

Возможно, вам стоит взглянуть на Metal, если вы ищете высокоскоростное манипулирование матрицей.

Paulw11 26.10.2018 08:51

@ Paulw11 благодарит вас за предложение, используя Metal. Я стараюсь.

Tuan Huynh 26.10.2018 09:44
2
4
976
0

Другие вопросы по теме