我对以下属性的一个问题是:
@property (atomic, assign) NSInteger variable;
如果我忘了它的原子,我可以直接引用ivar并撤消原子性。但是,如果我宣布:
@property (nonatomic, assign) _Atomic(NSInteger) variable;
然后,无论我是使用getter / setter还是访问ivar,它总是原子的,对吗?我们应该更喜欢后者吗?我的单线程基准测试表明这两者的速度与设置器相似,但我不知道这是否会根据同时发生的情况而改变。
答案 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等。希望这是一些帮助,有趣的问题。