Is “atomic” required here?
关于多线程编程的一个简单问题:我有一个NSmutableArray实例变量,它由主线程读取并由另一个线程设置。我目前正在使用:
1 | @property (nonatomic, retain) NSMutableArray *locations; |
但我想我现在必须删除"非原子"指令?
如果创建一个新数组并将其分配给位置,那么需要原子属性。
如果要从另一个线程添加/删除位置对象,则数组上的原子属性不适用。各种不可变的…集合不是线程安全的,因为添加/插入/删除方法不是设计为从多个线程调用的。
参见so问题:nsmutabledictionary线程安全
更好的方法可能是让另一个线程向主线程发送一个要添加或删除的位置数组,以便更改只在主线程上发生。
正确的IMO方法是保留所有属性的原子性,除非通过分析代码发现了明显的性能问题。
然而,在这种情况下,这将无济于事,因为使属性原子不做任何事情来使NStutabRayLee线程的内部状态安全。您需要使属性为原子,并引入某种同步来阻止一个线程修改数组(即添加或删除对象),而另一个线程正在访问该数组。因为这很难执行,我可能根本不把数组暴露为一个属性。我在父对象上有一些方法,比如:
1 2 | -(void) addLocation: (id) newLocation; -(id) locationAtIndex: (NSUInteger) index; |
类似于NSmutableArray方法,它们都是同步的。如果有一个属性返回整个数组,那么它将是只读的,并且将返回实数数组的不可变副本。
"非原子"不是线程安全的。看看这个问题:
iPhone SDK非原子和原子
在大多数情况下,将属性保留为非原子属性不会有问题。我几乎不需要使用原子,我的所有应用程序都使用某种类型的多线程。