【问题标题】: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++; 

在街区内?

【问题讨论】:

    标签: ios objective-c cocoa atomic


    【解决方案1】:

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

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

    第三,实例变量和属性的区别在于属性对于读写都是原子的。实例变量的更新仅对于写入是原子的(在您的示例中),尽管使其对于读取也是原子的也是微不足道的。

    这在以下情况下很重要:

    • 32 位硬件
    • 读取 64 位值

    步骤:

    1. 线程 1 开始加载,读取 32 位
    2. 线程 2 自动更新值
    3. 线程 1 加载其他 32 位

    如果读取是非原子的,则可能会发生上述情况。如果读取是原子的,则步骤 2 将发生在 1 之前或 3 之后(取决于时间),并且在任何一种情况下都会读取正确的值。

    【讨论】:

    • 发布后我已经意识到 volatile 和 __block 部分。想澄清你的最后一句话吗? 该属性对于读取也是原子的,但如果写入是原子的,这通常不是问题。
    • 好吧,如果写入是原子的,我想不出任何非原子读取会成为问题的例子,但我不想写一个绝对的,因为可能会有一些。跨度>
    • 其实,没关系。这个例子很明显:读取一半的 64 位数字,让写入器自动更新它,读取另一半。轰隆隆!
    • 啊,我明白了!谢谢!
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2014-01-08
    • 2010-09-19
    • 2012-12-19
    • 2010-09-08
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多