ios - OSAtomicIncrement64 x 类属性...有什么优势?

标签 ios objective-c cocoa atomic

如果我理解正确,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. 线程 1 开始加载,读取 32 位
  2. 线程 2 自动更新值
  3. 线程 1 加载其他 32 位

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

关于ios - OSAtomicIncrement64 x 类属性...有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724701/

相关文章:

iphone - 收到内存警告和应用程序崩溃

iphone - Objective-C - 如何制作绘图员的指南

macos - 显示新文档窗口的工作表

cocoa - 在 NSScrollView 中,垂直 slider 始终指向 View 的底部

ios - 展开影响应用程序的 Segue?

ios - Swift collectionView 不可重复使用的单元格

ios - 照片上传到 Firebase 数据库和存储但不在应用程序中保存照片

ios - 我们可以从 iOS 6 OTA 升级到 iOS 7 吗?使用过的数据被删除了吗?

iphone - 保持 iPod 空闲并且仍然能够联系服务器

iphone - 将核心数据添加到现有 Xcode 项目时出现未声明的标识符错误