Блокировка деталей синтезированных атомных @properties в Obj-C 2.0

Документация для свойств в Obj-C 2.0 говорит, что атомарные свойства используют блокировку внутри, но не документируют специфику блокировки. Кто-нибудь знает, является ли это блокировкой по каждому свойству, блокировка каждого объекта отдельно от неявного, используемого @synchronized (self), или эквивалент @synchronized (self)?

Ответ 1

Блокировка, используемая атомарными @properties, представляет собой деталь реализации - для соответствующих типов на соответствующих платформах возможны атомные операции без блокировки, и я был бы удивлен, если Apple не воспользовалась ими. В любом случае публичный доступ к блокировке отсутствует, поэтому вы не можете синхронизировать @при одной и той же блокировке. Несколько инженеров Apple указали, что атомные свойства не гарантируют безопасность потока; атомные свойства гарантируют, что gets/sets этого значения являются атомарными. Для правильной безопасности потоков вам нужно будет использовать блокировку или синхронизацию более высокого уровня, и вы почти наверняка не захотите использовать ту же самую блокировку, что и синтезирующие геттер/сеттер (ы).

Ответ 2

Глядя на сгенерированный код (iOS SDK GCC 4.0/4.2 для ARM),

  • 32-разрядные assign свойства (включая struct {int32_t v;}) доступны напрямую.
  • Доступ к более крупным 32-битным структурам осуществляется с помощью objc_copyStruct().
  • double и int64_t доступны с objc_copyStruct, за исключением GCC 4.0, к которым они обращаются напрямую с помощью stmia/ldmia (я не уверен, что в случае прерываний это гарантировано).
  • сохранить/копировать аксессоры вызова objc_getProperty и objc_setProperty.

Cocoa с помощью Love: Memory и поточные методы пользовательских свойств дает некоторые сведения о том, как они реализованы в версия выполнения objc4-371.2; очевидно, что конкретная реализация может варьироваться в зависимости от времени выполнения (например, на некоторых платформах вы можете использовать атомный своп /CAS для вращения на самом ivar вместо использования другой блокировки).