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. 线程1开始加载,读取32位
  2. 线程 2 自动更新值
  3. 线程 1 加载其他 32 位

如果读取为non-atomic,则可能会发生上述情况。如果读取是原子的,则第 2 步将发生在 1 之前或 3 之后(取决于时间),并且在任何一种情况下都会读取正确的值。