OSAtomicIncrement64 x 类属性...有啥优势?
Posted
技术标签:
【中文标题】OSAtomicIncrement64 x 类属性...有啥优势?【英文标题】:OSAtomicIncrement64 x class property... what is the advantage?OSAtomicIncrement64 x 类属性...有什么优势? 【发布时间】:2016-01-11 15:07:03 【问题描述】:如果我理解正确,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】:首先,将__block
属性添加到实例变量不会做任何事情;在任何情况下,变量都可以从块中修改。
其次,volatile
在这里并没有什么不同。这告诉编译器它不能假设该值是稳定的,并且在程序集(机器)级别重新排序内存操作时使用。不影响变量的原子性。
第三,实例变量和属性的区别在于属性对于读写都是原子的。实例变量的更新仅对于写入是原子的(在您的示例中),尽管使其对于读取也是原子的也是微不足道的。
这在以下情况下很重要:
32 位硬件 读取 64 位值步骤:
-
线程 1 开始加载,读取 32 位
线程 2 自动更新值
线程 1 加载其他 32 位
如果读取是非原子的,则可能会发生上述情况。如果读取是原子的,则步骤 2 将发生在 1 之前或 3 之后(取决于时间),并且在任何一种情况下都会读取正确的值。
【讨论】:
发布后我已经意识到 volatile 和 __block 部分。想澄清你的最后一句话吗? 该属性对于读取也是原子的,但如果写入是原子的,这通常不是问题。 好吧,如果写入是原子的,我想不出任何非原子读取会成为问题的例子,但我不想写一个绝对的,因为可能会有一些。跨度> 其实,没关系。这个例子很明显:读取一半的 64 位数字,让写入器自动更新它,读取另一半。轰隆隆! 啊,我明白了!谢谢!以上是关于OSAtomicIncrement64 x 类属性...有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效