在不同线程中频繁设置属性时崩溃

时间:2018-08-09 02:59:53

标签: ios multithreading

这样的代码:

for _ in 0...3 {
    DispatchQueue.global().async {
        for i in 0 ... 30000 {
            self.aString = "\(i)"
        }
    }
}

运行此代码时,它将崩溃:

  

malloc:对象0x6100000569de的***错误:无效的指针出队   从空闲列表中

如果我在线程中添加锁,它可以正常工作,就像串行队列一样:

for _ in 0...3 {
    DispatchQueue.global().async {
        self.lock.lock() // NSRecursiveLock
        for i in 0 ... 30000 {
            self.aString = "\(i)"
        }
        self.lock.unlock()
    } 
}

我认为,在不同线程中修改相同数据可能会导致数据不正确,但是为什么会崩溃?

1 个答案:

答案 0 :(得分:0)

使用主队列代替使用全局队列,它不会崩溃。

for _ in 0...3 {
    DispatchQueue.main.async {
        for i in 0 ... 30000 {
            self.aString = "\(i)"
        }
    }
}

完全不知道为什么会首先发生,但是使用主队列可以解决它。