如果我理解正确,OSAtomicIncrement64
应该用于自动递增变量。使用以下一种或另一种方案有什么区别/优势?
场景 1
@interface MyClass : NSObject {
__block volatile int64_t variable;
}
和
OSAtomicIncrement64(&variable);
block 内或
情景 2
@interface MyClass : NSObject
@property(atomic, assign) int64_t variable;
和
self.variable++;
在街区内?
最佳答案
首先,将__block
属性添加到实例变量不会做任何事情;在任何情况下,变量都可以从 block 中修改。
其次,volatile
在这里并没有什么区别。这告诉编译器它不能假设该值是稳定的,并且在程序集(机器)级别重新排序内存操作时使用。它不影响变量的原子性。
第三,实例变量和属性的区别是属性对于读写都是原子的。对实例变量的更新仅对写入具有原子性(在您的示例中),尽管使其对于读取也具有原子性是微不足道的。
这在以下情况下很重要:
- 32 位硬件
- 读取 64 位值
步骤:
- 线程 1 开始加载,读取 32 位
- 线程 2 自动更新值
- 线程 1 加载其他 32 位
如果读取是非原子的,则可能会发生上述情况。如果读取是原子的,则第 2 步将发生在 1 之前或 3 之后(取决于时间),并且在任何一种情况下都将读取正确的值。
关于ios - OSAtomicIncrement64 x 类属性...有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724701/