这里需要“原子”吗?

时间:2010-11-29 01:27:08

标签: iphone objective-c multithreading cocoa

关于multhreading编程的一个简单问题:我有一个NSMutableArray实例变量,由主线程读取并由另一个线程设置。我目前正在使用它:

@property (nonatomic, retain) NSMutableArray *locations;

但我想我现在必须删除“非原子”指令?

3 个答案:

答案 0 :(得分:3)

如果您创建一个新数组并将其分配给位置,那么将需要原子属性。

如果要从其他线程添加/删除位置对象,则阵列上的原子属性不适用。各种NSMutable ...集合不是线程安全的,因为add / insert / remove方法不是设计为从多个线程调用的。

请参阅问题:NSMutableDictionary thread safety

更好的方法可能是让另一个线程向主线程发送一个位置数组来添加或删除,以便更改只发生在主线程上。

答案 1 :(得分:0)

“nonatomic”不是线程安全的。看看这个问题:

iPhone SDK Nonatomic and Atomic

在大多数情况下,将属性保留为非原子状态不会有问题。我几乎从不需要使用原子,我的所有应用程序都使用某种多线程。

答案 2 :(得分:0)

正确的方法IMO是将所有属性保留为原子,除非通过分析代码显示出可证明的性能问题。

但是,这在这个实例中没有帮助,因为使属性atomic不会使NSMutableArray线程的内部状态安全。你需要使属性atomic 引入某种同步来阻止一个线程修改数组(即添加或删除对象),而另一个线程正在访问它。由于执行起来非常棘手,我可能根本不会将数组公开为属性。我在父对象上有方法,如:

-(void) addLocation: (id) newLocation;
-(id) locationAtIndex: (NSUInteger) index;

等。类似于NSMutableArray方法,它们都是同步的。如果有一个属性返回整个数组,它将是只读的,并将返回真实数组的不可变副本。