哪个是线程安全原子或非原子?

时间:2015-08-31 08:05:52

标签: ios objective-c xcode memory-management

在阅读this回答后,我感到很困惑。

有人说原子是线程安全的,有些人说非原子是线程安全的。

这是什么答案。

4 个答案:

答案 0 :(得分:0)

正如在发布的问题的几个答案中提到的,原子是线程安全的。这意味着在任何其他线程可以执行getter / setter之前,任何线程上的getter / setter都应该先完成。

答案 1 :(得分:0)

正如你可以在developer.apple阅读的那样,你应该使用原子函数来保存线程。

您可以在此处阅读有关原子功能的更多信息:Atomic Man page

简而言之: 原子〜不可拆分〜不由线程共享

答案 2 :(得分:0)

操作不安全是由于操作可以分为几个子操作,例如:

a = a + 1

可以细分为操作

load value of a
add 1 to the loaded value
assign the calculated value to a.

单词" Atomic"来自" atom"来自希腊" atomos",这意味着"那些不能分裂的#34;。对于一个操作,它意味着它总是作为一个整体执行,它从不执行一次一个子操作。这就是为什么它是线程安全的。

TL; DR Atomic =线程安全。

大警告:拥有属性原子并不意味着整个函数/类是线程安全的。原子属性仅表示具有给定属性的操作是线程安全的。

答案 3 :(得分:0)

很显然,nonatomic当然不是线程安全的。更有趣的是,atomic更接近,但也不足以实现“线程安全性”。引用苹果公司的Programming with Objective-C: Encapsulating Data

  

注意:属性原子性不是对象线程安全的同义词。

接着提供一个示例:

  

考虑一个XYZPerson对象,其中使用一个线程中的原子访问器来更改一个人的名字和姓氏。如果另一个线程同时访问两个名称,则原子获取方法将返回完整的字符串(不会崩溃),但不能保证这些值相对于彼此都是正确的名称。如果在更改之前访问了名字,但在更改之后访问了姓氏,那么您将得到一对不一致且不匹配的名称。

     

这个例子非常简单,但是当跨相关对象网络考虑时,线程安全性的问题变得更加复杂。 Concurrency Programming Guide中详细介绍了线程安全性。

另请参阅bbum的Objective-C: Atomic, properties, threading and/or custom setter/getter

之所以如此令人困惑,是因为实际上atomic关键字确实确保您对该立即引用的访问是线程安全的。不幸的是,在处理对象时,这还远远不够。首先,您无法保证该属性本身的内部属性是线程安全的。其次,它不会同步您的应用对对象的各个属性的访问(例如上面的Apple示例)。因此,atomic几乎总是不足以实现线程安全,因此通常必须采用更高级别的同步。而且,如果您提供更高级别的同步,则向该混合中添加原子性是多余且效率低下的。

因此,对于对象,atomic几乎没有任何实用程序。但是,在处理原始C数据类型(例如整数,布尔值,浮点数)时,它可能会很有用。例如,您可能在其他某个线程中更新了一些布尔值,表明该线程的异步任务是否已完成。这是atomic的完美用例。

否则,我们通常会寻求用于线程安全的更高级别的同步机制,例如GCD串行队列或读取器-写入器模式(...,或者,如今不那么流行,锁,@synchronized指令等)。 )。