Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在不同线程中频繁同步设置属性时崩溃_Ios_Multithreading - Fatal编程技术网

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

Ios 在不同线程中频繁同步设置属性时崩溃,ios,multithreading,Ios,Multithreading,代码如下所示: for _ in 0...3 { DispatchQueue.global().async { for i in 0 ... 30000 { self.aString = "\(i)" } } } 运行此代码时,它将崩溃: malloc:**对象0x610000569DE的错误:无效指针已退出队列 从免费名单 如果我在线程中添加锁,它可以正常工作,就像一个串行队列: for _ in 0...3 {

代码如下所示:

for _ in 0...3 {
    DispatchQueue.global().async {
        for i in 0 ... 30000 {
            self.aString = "\(i)"
        }
    }
}
运行此代码时,它将崩溃:

malloc:**对象0x610000569DE的错误:无效指针已退出队列 从免费名单

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

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

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

使用主队列而不是全局队列,它不会崩溃

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

首先,我不知道为什么会发生这种情况,但使用主队列可以解决问题。

你能分享更多关于你的课程的详细信息吗?阿斯特林只是一个普通的吗?设置aString时您在做什么?@HAK只是ViewController的一个属性,单击按钮时调用代码。是的,我认为这是因为异步主线程是串行的。因此,不会出现同时修改属性并且不会崩溃的情况。而全局是并发的。我只是想知道为什么会崩溃。我在某个地方读到,快速多次设置属性也会导致此错误。将计数从30000更改为20,它也不会在全局队列上崩溃。但是增加到30,它会再次崩溃。