首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这里需要"atomic“吗?

这里需要"atomic“吗?
EN

Stack Overflow用户
提问于 2010-11-29 09:27:08
回答 3查看 568关注 0票数 2

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

代码语言:javascript
复制
@property (nonatomic, retain) NSMutableArray *locations;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-29 11:00:03

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

如果您要从另一个线程添加/删除location对象,则数组上的原子属性不适用。各种NSMutable..。集合不是线程安全的,因为add/insert/remove方法不是设计为从多个线程调用的。

请参阅SO问题:NSMutableDictionary thread safety

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

票数 3
EN

Stack Overflow用户

发布于 2010-11-29 09:35:33

“非原子”不是线程安全的。看看这个SO问题:

iPhone SDK Nonatomic and Atomic

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

票数 0
EN

Stack Overflow用户

发布于 2010-11-29 17:35:31

正确的方法是将所有属性保留为原子的,除非在分析代码时发现了明显的性能问题。

然而,在这种情况下不会有什么帮助,因为使属性原子化并不能使NSMutableArray线程的内部状态安全。您需要使属性成为原子属性,并引入某种类型的同步,以阻止一个线程在另一个线程访问数组时修改数组(即添加或删除对象)。因为这很难执行,所以我可能根本不会将数组公开为属性。我在父对象上有类似如下的方法:

代码语言:javascript
复制
-(void) addLocation: (id) newLocation;
-(id) locationAtIndex: (NSUInteger) index;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4300212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档