Блокировка деталей синтезированных атомных @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 вместо использования другой блокировки).