如果我理解正确,OSAtomicIncrement64
应该用于原子地增加变量。使用下面一种或另一种情况的区别/优势是什么?
情景1
@interface MyClass : NSObject {
__block volatile int64_t variable;
}
和
OSAtomicIncrement64(&variable);
在一个区块内或
情景2
@interface MyClass : NSObject
@property(atomic, assign) int64_t variable;
和
self.variable++;
在街区内?
答案 0 :(得分:2)
首先,将__block
属性添加到实例变量中并不做任何事情;在任何情况下,变量都可以从块中修改。
其次,volatile
在这里并没有什么不同。这告诉编译器它不能假设该值是稳定的,并且在组装(机器)级别重新排序内存操作时使用。它不会影响变量的原子性。
第三,实例变量和属性之间的区别在于该属性对于读取和写入都是原子的。实例变量的更新对于写入来说只是原子的(在你的例子中),尽管使读取成为原子也是微不足道的。
这在以下情况中很重要:
步骤:
如果读取是非原子的,则可能发生上述情况。如果读取是原子的,则步骤2将在1之前或之后发生(取决于时间),并且在任何一种情况下都将读取正确的值。