2009-05-27 5 views
9

La documentación de las propiedades en Obj-C 2.0 dice que las propiedades atómicas usan un bloqueo interno, pero no documenta las características específicas del bloqueo. ¿Alguien sabe si se trata de un bloqueo por propiedad, un bloqueo por objeto separado del implícito utilizado por @synchronized (self), o el equivalente de @synchronized (self)?Bloqueando detalles de @ propiedades atómicas sintetizadas en Obj-C 2.0

Respuesta

6

El bloqueo utilizado por atomic @properties es un detalle de implementación: para los tipos apropiados en las plataformas apropiadas, son posibles las operaciones atómicas sin bloqueo y me sorprendería que Apple no las aprovechara. No hay acceso público al bloqueo en ningún caso, por lo que no puede @synchronize en el mismo bloqueo. Varios ingenieros de Apple han señalado que las propiedades atómicas no garantizan la seguridad del hilo; las propiedades atómicas solo garantizan que los conjuntos/conjuntos de ese valor sean atómicos. Para una correcta seguridad de la hebra, tendrá que utilizar el bloqueo o la sincronización de mayor nivel y es casi seguro que no quiera utilizar el mismo bloqueo que podría estar utilizando el captador/decodificador de sintetizadores.

+0

Sí, ver "hombre atómico". –

+0

Ok. Estaba preguntando porque me preguntaba si habría una sobrecarga adicional para usar ambas propiedades atómicas y una @synchronized() cuando se trata de varias propiedades al mismo tiempo. Parece que, para las operaciones que no se pueden hacer usando una primitiva atómica, habrá una sobrecarga adicional, ya que usa 2 cerraduras de manera efectiva. Ah bueno. –

+0

En este caso, cuando ya está utilizando un bloque @synchronized o protegido de otra manera para implementar la semántica de bloqueo de nivel superior, puede tener sentido utilizar elementos no atómicos para sus propiedades. –

9

Mirando el código generado (iOS SDK GCC 4.0/4.2 para ARM),

  • 32-bit assign propiedades (incluyendo struct {int32_t v;}) se accede directamente.
  • Se accede a las estructuras de más de 32 bits con objc_copyStruct().
  • double y int64_t se accede con objc_copyStruct, excepto en GCC 4.0, donde se accede directamente con stmia/ldmia (no estoy seguro de si se garantiza que esto sea atómico en caso de interrupciones).
  • retención/copia de acceso de acceso objc_getProperty y objc_setProperty.

Cocoa with Love: Memory and thread-safe custom property methods proporciona algunos detalles sobre cómo se implementan en runtime version objc4-371.2; obviamente, la implementación precisa puede variar entre los tiempos de ejecución (por ejemplo, en algunas plataformas puede usar el intercambio atómico/CAS para girar el ivar en lugar de usar otro bloqueo).

Cuestiones relacionadas