我有一个NSMutableArray * testArray,它由多个线程访问,并在4个不同的函数中使用。让我们说A类从函数'addValue:'中的线程13(后台线程)更新这个testArray,而B类从函数'checkIndex:'中的线程1(主线程)更新testArray。
在'addValue:'函数里面我正在更新testArray的内容,然后是B类,它使用'checkIndex'检查testArray中对象的索引。 A类更新testArray,B类从testArray的旧副本中获取索引。我在哪里使testArray线程安全?
对于TestArray
Class A -> addValue: (BackgroundThread)
Class B -> checkIndex: (Main Thread)
答案 0 :(得分:1)
数组不是线程安全的。
我猜你可以创建一个NSArray(Actually NSMutableArray)的自定义子类,它是线程安全的,但是NSArray是类集群的一部分,并且对类集群进行子类化是很棘手的,并且由于系统使用各种各样,你可能会降低性能内部子类根据您的用例优化性能,您的子类可能不具备这些智能。
您可以做的是创建线程安全的包装函数。创建一个包含数组的类,并提升NSMutableArray所使用的相同访问器方法。
让该子类在每次对数组的读或写调用时声明锁定。
在这种情况下,自旋锁可能是一个不错的选择,因为读数和冲突数可能相当小,读写操作的速度应该很快。 (自旋锁不需要内核调用,并导致调用线程阻塞,直到释放另一个线程的锁。缺少内核调用意味着它在非冲突情况下非常快,并且因为读写调用很快,即使是碰撞案也不是那么糟糕。)
在Xcode文档中搜索“线程编程指南”,了解有关可以使用的不同类型锁定及其优缺点的更多信息。