2011-01-14 27 views
5

Propiedades de Objective-C predeterminadas a atomic, lo que garantiza que los accesadores sean atómicos pero no aseguren la seguridad general del hilo (según this question). Mi pregunta es, ¿no son las propiedades atómicas redundantes en la mayoría de los escenarios de simultaneidad? Por ejemplo:¿Bajo qué circunstancias son útiles las propiedades atómicas?

Escenario 1: propiedades mutables

@interface ScaryMutableObject : NSObject {} 

@property (atomic, readwrite) NSMutableArray *stuff; 

@end 

void doStuffWith(ScaryMutableObject *obj) { 
    [_someLock lock]; 
    [obj.stuff addObject:something]; //the atomic getter is completely redundant and could hurt performance 
    [_someLock unlock]; 
} 

//or, alternatively 
void doStuffWith(ScaryMutableObject *obj) { 
    NSMutableArray *cachedStuff = obj.stuff; //the atomic getter isn't redundant 
    [_someLock lock]; 
    [cachedStuff addObject:something]; //but is this any more performant than using a nonatomic accessor within the lock? 
    [_someLock unlock]; 
} 

Escenario 2: propiedades inmutables

Estaba pensando que tal vez las propiedades atómicas serían útiles para evitar bloqueos cuando se trabaja con objetos inmutables , pero como los objetos inmutables pueden apuntar a objetos mutables en Objective-C, esto no es de mucha ayuda:

@interface SlightlySaferObject : NSObject {} 

@property (atomic, readwrite) NSArray *stuff; 

@end 

void doStuffWith(SlightlySaferObject *obj) { 
    [[obj.stuff objectAtIndex:0] mutateLikeCrazy];//not at all thread-safe without a lock 
} 

Los únicos escenarios que se me ocurre dónde es seguro de usar descriptores de acceso atómicas sin cerradura (y por lo tanto vale la pena utilizar las propiedades atómicas en absoluto) son:

  1. Trabajar con propiedades que son primitivas;
  2. Trabajar con propiedades que se garantiza que sea inmutable y no para apuntar a objetos mutables (tales como un NSString o un NSArray de objetos inmutables).

¿E-cando algo? ¿Hay alguna otra buena razón para usar propiedades atómicas?

+1

Creo que la otra cuestión de forma vinculada por el puesto lo cubre bien. atomic solo cubre * acceso * a la propiedad - p. no puede recuperar un int que es medio viejo y medio nuevo, sería todo viejo o totalmente nuevo (en el caso de obj-c, también hace una garantía en los recuentos retenidos). En general, pueden requerirse bloqueos/barreras completos. Sin embargo, el acceso atómico (no CAS, que es diferente) se puede usar en algunos algoritmos "sin bloqueo" y/o en bucles de subproceso de simplemente extraer. Así que sí, cubren un poco de terreno. –

+0

posible duplicado de [Propiedades de Objective-C: atómico vs no atómico] (http://stackoverflow.com/questions/588866/objective-c-properties-atomic-vs-nonatomic) – bbum

+0

@pst Totalmente correcto y hay algunos tipos escalares en algunos ABI que pueden ser parciales. ¡Creo que fue PPC el que colocaría la mitad de un tipo escalar particular en un registro y la otra mitad en la pila, de modo que en realidad podría obtener un comportamiento de medio a nuevo medio en un escalar de otro modo de valor único! – bbum

Respuesta

6

No le falta nada; La utilidad de atomic se limita en gran medida solo a situaciones donde necesita acceder o establecer un valor particular a partir de múltiples hilos donde ese valor también es integral.

Más allá de un solo valor, atomic no se puede utilizar para seguridad de hilos.

Escribí bastante sobre esto en un weblog post a while ago.

Esta pregunta es también un [muy bien planteado] duplicado de What's the difference between the atomic and nonatomic attributes?

+0

Perdón por reiniciar un hilo 3 años después pero @bbum, ¿quisiste decir "donde el valor no es integral" ya que la atomicidad no te garantiza qué valor, solo un valor legítimo? Estoy tratando de entender esto así que solo pido mi aclaración. – MoMo

+0

@MoMo Correcto.La atomicidad solo garantiza la integridad del valor, no si obtendrá el valor nuevo o antiguo. E incluso la frase "más allá de un solo valor" a veces es incorrecta. En PPC, los valores de 64 bits a veces se pueden dividir entre un registro de 32 bits y uno de 32 bits. – bbum

Cuestiones relacionadas