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 类属性...有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章

springboot1.x和2.x将配置属性绑定到对象上

OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 失败,但在 X86_64 中有效

Python3.x基础学习-类--类属性和实例属性

从 x86-64 可执行文件中查找类和函数名称

ElasticSearch_09_ES 7.x版本的两个变动

ElasticSearch_09_ES 7.x版本的两个变动