Блокировка деталей синтезированных атомарных @ свойств в Obj-C 2.0 - PullRequest
10 голосов
/ 28 мая 2009

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

Ответы [ 2 ]

9 голосов
/ 01 декабря 2010

Просмотр сгенерированного кода (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.

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

7 голосов
/ 28 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...