关于多线程编程有一个简单的问题:我有一个由主线程读取并由另一个线程设置的NSMutableArray实例变量。我目前使用的是:
@property (nonatomic, retain) NSMutableArray *locations;但是我假设我现在必须删除“非原子”指令?
发布于 2010-11-29 11:00:03
如果您创建一个新数组并将其分配给位置,那么是的,将需要原子属性。
如果您要从另一个线程添加/删除location对象,则数组上的原子属性不适用。各种NSMutable..。集合不是线程安全的,因为add/insert/remove方法不是设计为从多个线程调用的。
请参阅SO问题:NSMutableDictionary thread safety
一种更好的方法可能是让另一个线程向主线程发送一个要添加或删除的位置数组,以便更改只发生在主线程上。
发布于 2010-11-29 09:35:33
“非原子”不是线程安全的。看看这个SO问题:
iPhone SDK Nonatomic and Atomic
在大多数情况下,将属性保留为非原子属性不会有问题。我几乎不需要使用原子,我的所有应用程序都使用某种类型的多线程。
发布于 2010-11-29 17:35:31
正确的方法是将所有属性保留为原子的,除非在分析代码时发现了明显的性能问题。
然而,在这种情况下不会有什么帮助,因为使属性原子化并不能使NSMutableArray线程的内部状态安全。您需要使属性成为原子属性,并引入某种类型的同步,以阻止一个线程在另一个线程访问数组时修改数组(即添加或删除对象)。因为这很难执行,所以我可能根本不会将数组公开为属性。我在父对象上有类似如下的方法:
-(void) addLocation: (id) newLocation;
-(id) locationAtIndex: (NSUInteger) index;等等,类似于NSMutableArray方法,它们都是同步的。如果有一个返回整个数组的属性,那么它将是只读的,并且将返回真实数组的不可变副本。
https://stackoverflow.com/questions/4300212
复制相似问题