代码之家  ›  专栏  ›  技术社区  ›  Lily Ballard

obj-c 2.0中合成原子@properties的锁定细节

  •  10
  • Lily Ballard  · 技术社区  · 16 年前

    obj-c 2.0中属性的文档说明原子属性在内部使用锁,但它不记录锁的细节。有人知道这是每个属性锁、每个对象锁(与@synchronized(self)使用的隐式锁分开)还是相当于@synchronized(self)的锁?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Barry Wark    16 年前

    原子@properties使用的锁是一个实现细节——对于适当平台上的适当类型,没有锁的原子操作是可能的,如果苹果没有利用它们,我会感到惊讶。在任何情况下都没有对锁的公共访问,因此不能在同一个锁上@synchronize。几个苹果工程师指出原子属性不能保证线程安全;原子属性只保证获取/设置该值是原子的。为了确保正确的线程安全,您必须使用更高级别的锁或同步,而且几乎可以肯定,您不希望使用与合成器getter/setter可能使用的锁相同的锁。

        2
  •  9
  •   tc.    14 年前

    查看生成的代码(iOS SDK GCC 4.0/4.2 for ARM),

    • 32位 assign 属性(包括 struct {int32_t v;} )直接访问。
    • 使用objc_CopyStruct()可以访问大于32位的结构。
    • double int64_t 使用objc-copystruct访问,但在GCC 4.0中,使用stmia/ldmia直接访问它们(我不确定在中断情况下是否保证这是原子的)。
    • 保留/复制访问器调用objc_getproperty和objc_setproperty。

    Cocoa with Love: Memory and thread-safe custom property methods 提供了有关如何在中实现它们的一些详细信息 runtime version objc4-371.2 ;显然,在不同的运行时,精确的实现可能会有所不同(例如,在某些平台上,您可以使用原子交换/cas在ivar本身上旋转,而不是使用另一个锁)。