ios阵列崩溃多线程问题,线程安全



我正在分析一份崩溃报告,遇到了一个异常,可能是由于竞争条件引起的(我的最佳猜测)。

故障日志:

Fatal Exception: NSInvalidArgumentException
*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[9]
0    CoreFoundation       
__exceptionPreprocess + 132
2    CoreFoundation    
-[__NSPlaceholderArray initWithObjects:count:] + 412
3    CoreFoundation    
-[NSArray initWithArray:range:copyItems:] + 464

最有可能的罪魁祸首是我的代码。由于数组永远不应该包含零值,我猜测这可能是一个竞争条件,因为这一行在重复计时器上运行,并且批处理数组会更新,基于位置的请求也会定期出现在其他地方。

NSArray *batchesCopy = [self.batches copy];

我的问题是,在这些比赛条件下,最好的保护方式是什么?有没有一种线程安全的方法来执行数组复制或数组编辑?例如互斥锁,或者可能在属性上使用"原子"选项?

有语言级锁定:

@synchronized(self){
    //array operations
}

一种方法是无锁方法,其中指定的线程是唯一读取或更改对象值的线程。您可以使用现有的串行线程(最常见的是主线程,因为它已经存在了,有很多简单的方法可以在上面运行代码),也可以只为该对象或对象类保留一个自定义串行线程。这种风格是,每当你需要与该事物交互时,你都会在指定的线程上调度一个块,该块读取或写入数据,并根据新值完成最终的工作。这种方式可以避免死锁和自旋锁,速度更快,但也可以是更多的代码。

最新更新