非原子原子与原子原子非原子性质的原子性质?

时间:2017-07-26 16:10:33

标签: ios objective-c multithreading atomic

我对以下属性的一个问题是:

@property (atomic, assign) NSInteger variable;

如果我忘了它的原子,我可以直接引用ivar并撤消原子性。但是,如果我宣布:

@property (nonatomic, assign) _Atomic(NSInteger) variable;

然后,无论我是使用getter / setter还是访问ivar,它总是原子的,对吗?我们应该更喜欢后者吗?我的单线程基准测试表明这两者的速度与设置器相似,但我不知道这是否会根据同时发生的情况而改变。

1 个答案:

答案 0 :(得分:1)

我不确定你的问题是否有明确的答案,但由于在撰写本文时没有其他答案,我会提供以下内容,希望它有所帮助。

宣称的属性以及nonatomic限定符(默认属性为atomic,atomic不存在)在2009年大约2009年的Objective-C 2.0中引入。_Atomic()来自C11 ,大约2011年。

因此,我们有两个独立的语言发展来解决原子性问题。

Objective-C没有严格定义,整个语言的最后一个“规范”可以追溯到2009年,尽管从那时起扩展,我知道没有规范讨论C的原子特征和Objective-C的原子属性相互作用。因此,与许多Objective-C问题一样,这取决于编译器的作用。

对于atomic和{{1}的所有组合,目前针对英特尔的Xcode 8.x编译器似乎生成了尊重原子性的代码,最多至少128位(此答案的测试限制)虽然指定两者有点多余。为_Atomic()生成的代码更可能涉及自旋锁,当然还涉及函数调用;而atomic 更有可能使用cpu交换指令并进行内联编译。

  

我们应该更喜欢后者吗? [_Atomic()]

如果您打算使用直接访问支持变量,我将跳过任何有关优点或其他方面的讨论,那么可能。

如果您不打算直接访问支持变量,那么使用_Atomic()可能会为单个cpu指令交换一个旋转锁定调用,每个指令都有自己的影响,因此任何偏好都取决于您如何权衡这些

简而言之:YMMV,以上适用于Intel,Xcode 8.x等。希望这是一些帮助,有趣的问题。