ios数组崩溃多线程问题,线程安全

时间:2015-02-20 18:34:35

标签: ios thread-safety crash-reports

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

崩溃日志:

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

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

NSArray *batchesCopy = [self.batches copy];

我的问题是,防止这些竞争条件的最佳方法是什么?是否有一种线程安全的方法来进行数组复制或数组编辑?例如,互斥锁或者可以使用" atomic"物业选项?

2 个答案:

答案 0 :(得分:1)

语言级锁定:

@synchronized(self){
    //array operations
}

答案 1 :(得分:0)

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