OSAtomicIncrement64 x类属性......有什么优势?

时间:2016-01-11 15:07:03

标签: ios objective-c cocoa atomic

如果我理解正确,OSAtomicIncrement64应该用于原子地增加变量。使用下面一种或另一种情况的区别/优势是什么?

情景1

@interface MyClass : NSObject {
  __block volatile int64_t  variable;
}

OSAtomicIncrement64(&variable);

在一个区块内或

情景2

@interface MyClass : NSObject
  @property(atomic, assign) int64_t variable;

self.variable++; 

在街区内?

1 个答案:

答案 0 :(得分:2)

首先,将__block属性添加到实例变量中并不做任何事情;在任何情况下,变量都可以从块中修改。

其次,volatile在这里并没有什么不同。这告诉编译器它不能假设该值是稳定的,并且在组装(机器)级别重新排序内存操作时使用。它不会影响变量的原子性。

第三,实例变量和属性之间的区别在于该属性对于读取和写入都是原子的。实例变量的更新对于写入来说只是原子的(在你的例子中),尽管使读取成为原子也是微不足道的。

这在以下情况中很重要:

  • 32位硬件
  • 读取64位值

步骤:

  1. 线程1开始加载,读取32位
  2. 线程2原子地更新值
  3. 线程1加载其他32位
  4. 如果读取是非原子的,则可能发生上述情况。如果读取是原子的,则步骤2将在1之前或之后发生(取决于时间),并且在任何一种情况下都将读取正确的值。