OSAtomicIncrement64 x class 属性...有什么好处?
OSAtomicIncrement64 x class property... what is the advantage?
如果我理解正确,OSAtomicIncrement64
应该用于自动递增变量。使用以下一种或另一种方案的 difference/advantage 是什么?
情景 1
@interface MyClass : NSObject {
__block volatile int64_t variable;
}
和
OSAtomicIncrement64(&variable);
块内或
情景 2
@interface MyClass : NSObject
@property(atomic, assign) int64_t variable;
和
self.variable++;
在街区内?
首先,将 __block
属性添加到实例变量不会做任何事情;在任何情况下都可以从块中修改变量。
其次,volatile
在这里并没有什么区别。这告诉编译器它不能假设该值是稳定的,并且在程序集(机器)级别重新排序内存操作时使用。它不影响变量的原子性。
第三,实例变量和属性的区别在于属性对于读写都是原子的。对实例变量的更新对于写入来说只是原子的(在你的例子中),尽管让它对于读取也是原子的是微不足道的。
这在以下情况下很重要:
- 32 位硬件
- 读取 64 位值
步骤:
- 线程1开始加载,读取32位
- 线程 2 自动更新值
- 线程 1 加载其他 32 位
如果读取为non-atomic,则可能会发生上述情况。如果读取是原子的,则第 2 步将发生在 1 之前或 3 之后(取决于时间),并且在任何一种情况下都会读取正确的值。
如果我理解正确,OSAtomicIncrement64
应该用于自动递增变量。使用以下一种或另一种方案的 difference/advantage 是什么?
情景 1
@interface MyClass : NSObject {
__block volatile int64_t variable;
}
和
OSAtomicIncrement64(&variable);
块内或
情景 2
@interface MyClass : NSObject
@property(atomic, assign) int64_t variable;
和
self.variable++;
在街区内?
首先,将 __block
属性添加到实例变量不会做任何事情;在任何情况下都可以从块中修改变量。
其次,volatile
在这里并没有什么区别。这告诉编译器它不能假设该值是稳定的,并且在程序集(机器)级别重新排序内存操作时使用。它不影响变量的原子性。
第三,实例变量和属性的区别在于属性对于读写都是原子的。对实例变量的更新对于写入来说只是原子的(在你的例子中),尽管让它对于读取也是原子的是微不足道的。
这在以下情况下很重要:
- 32 位硬件
- 读取 64 位值
步骤:
- 线程1开始加载,读取32位
- 线程 2 自动更新值
- 线程 1 加载其他 32 位
如果读取为non-atomic,则可能会发生上述情况。如果读取是原子的,则第 2 步将发生在 1 之前或 3 之后(取决于时间),并且在任何一种情况下都会读取正确的值。