非原子基元的原子 属性 与原子基元的非原子 属性?
Atomic property of a nonatomic primitive vs. nonatomic property of an atomic primitive?
我有一个 属性 的问题,例如:
@property (atomic, assign) NSInteger variable;
如果我忘记它是原子的,我可能会直接引用 ivar 并撤消该原子性。但是,如果我这样声明:
@property (nonatomic, assign) _Atomic(NSInteger) variable;
那么无论我是使用 getter/setter 还是访问 ivar,它总是原子的,对吗?那么我们应该更喜欢后者吗?我的单线程基准测试表明这两个 setter 的速度相似,尽管我不知道这是否会根据同时发生的事情而改变。
我不确定您的问题是否有 明确的 答案,但由于在撰写本文时不存在其他答案,我将提供以下内容,希望它能有帮助。
声明的属性以及 nonatomic
限定符(默认属性是原子的,atomic
不存在)在 2009 年左右的 Objective-C 2.0 中引入。_Atomic()
来自 C11,大约 2011 年。
所以我们有两个独立的语言开发来解决原子性问题。
Objective-C 没有严格定义,所有语言的最后一个 "specification" 可以追溯到 2009 年,尽管从那以后有一些扩展,而且我知道没有规范讨论 C 的原子特性和Objective-C 的原子属性相互作用。因此,与许多 Objective-C 问题一样,这取决于编译器的工作。
当前针对英特尔的 Xcode 8.x 编译器似乎生成尊重原子性的代码,最多至少 128 位(此答案的测试限制),对于 atomic
和 _Atomic()
– 尽管同时指定两者有点多余。为 atomic
生成的代码 更有可能 涉及自旋锁,当然也涉及函数调用;而 _Atomic()
更有可能 使用 cpu 交换指令并内联编译。
So should we prefer the latter? [_Atomic()
]
如果您打算使用对支持变量的直接访问,我将跳过任何关于这样做的优点或其他方面的讨论,那么可能。
如果您不打算直接访问支持变量,那么使用 Atomic()
可能会将自旋锁调用交换为单个 cpu 指令,每个指令都有其自身的影响,因此任何偏好都是取决于你如何权衡这些。
简而言之:YMMV,以上适用于英特尔,Xcode 8.x等。希望对您有所帮助,有趣的问题。
我有一个 属性 的问题,例如:
@property (atomic, assign) NSInteger variable;
如果我忘记它是原子的,我可能会直接引用 ivar 并撤消该原子性。但是,如果我这样声明:
@property (nonatomic, assign) _Atomic(NSInteger) variable;
那么无论我是使用 getter/setter 还是访问 ivar,它总是原子的,对吗?那么我们应该更喜欢后者吗?我的单线程基准测试表明这两个 setter 的速度相似,尽管我不知道这是否会根据同时发生的事情而改变。
我不确定您的问题是否有 明确的 答案,但由于在撰写本文时不存在其他答案,我将提供以下内容,希望它能有帮助。
声明的属性以及 nonatomic
限定符(默认属性是原子的,atomic
不存在)在 2009 年左右的 Objective-C 2.0 中引入。_Atomic()
来自 C11,大约 2011 年。
所以我们有两个独立的语言开发来解决原子性问题。
Objective-C 没有严格定义,所有语言的最后一个 "specification" 可以追溯到 2009 年,尽管从那以后有一些扩展,而且我知道没有规范讨论 C 的原子特性和Objective-C 的原子属性相互作用。因此,与许多 Objective-C 问题一样,这取决于编译器的工作。
当前针对英特尔的 Xcode 8.x 编译器似乎生成尊重原子性的代码,最多至少 128 位(此答案的测试限制),对于 atomic
和 _Atomic()
– 尽管同时指定两者有点多余。为 atomic
生成的代码 更有可能 涉及自旋锁,当然也涉及函数调用;而 _Atomic()
更有可能 使用 cpu 交换指令并内联编译。
So should we prefer the latter? [
_Atomic()
]
如果您打算使用对支持变量的直接访问,我将跳过任何关于这样做的优点或其他方面的讨论,那么可能。
如果您不打算直接访问支持变量,那么使用 Atomic()
可能会将自旋锁调用交换为单个 cpu 指令,每个指令都有其自身的影响,因此任何偏好都是取决于你如何权衡这些。
简而言之:YMMV,以上适用于英特尔,Xcode 8.x等。希望对您有所帮助,有趣的问题。