Per objC Proprietà - Né sono sicuri thread.
Atomic è più resistente a agli errori di threading. Nel complesso, è un insolito insolito. Gli scenari che preferiresti agli atomici sono pochissimi. Atomico può aumentare la probabilità di correttezza, ma è troppo basso per essere considerato un sostituto per un meccanismo di bloccaggio adeguato. Pertanto, se hai bisogno di sicurezza del thread, hai ancora bisogno di qualche altra primitiva di sincronizzazione sopra le letture/scritture atomiche. Se non si ha bisogno della sicurezza del thread (ad esempio l'istanza è immutabile o destinata all'esecuzione solo dal thread principale), atomic non aggiungerà nulla.
Essere resistente a errori di threading non è una 'qualità' - serve a mascherare errori di threading reali e renderli più difficili da riprodurre e rilevare.
Si noti inoltre che i tipi mutabili e immutabili non garantiscono effettivamente la sicurezza del thread.'Mutabile' può essere usato nei nomi ObjC per riferirsi solo all'interfaccia - le parti interne di un'istanza immutabile possono effettivamente avere uno stato interno mutabile. In breve, non si può presumere che un tipo che ha una sottoclasse mutabile sia sicuro per i thread.
Domanda Expanded:
Supponiamo che ci sia una proprietà di stringa atomica denominata "nome", e se si chiama [auto setName: @ "A"] dal filo A, chiamata [self setName: @ "B"] dal thread B e chiama [self name] dal thread C, quindi tutte le operazioni su thread differenti verranno eseguite in serie, il che significa che se un thread sta eseguendo setter o getter, gli altri thread attenderanno.
Se tutti i thread hanno tentato di leggere e/o scrivere nella proprietà contemporaneamente, solo un thread avrebbe accesso alla volta e gli altri sarebbero bloccati se la proprietà fosse atomica. Se la proprietà fosse non anatomica, allora tutti avrebbero accesso non controllato alla lettura e alla scrittura della variabile allo stesso "tempo".
se un altro thread D chiama [nome release] contemporaneamente, questa operazione potrebbe produrre un arresto anomalo perché non è presente alcuna chiamata setter/getter.
Corretto.
Ciò significa che un oggetto è in lettura/scrittura sicuro (ATOMIC) ma non thread-safe poiché un altro thread può inviare contemporaneamente qualsiasi tipo di messaggio all'oggetto.
Bene, c'è davvero molto di più. L'esempio comune è:
@interface MONPerson : NSObject
@property (copy) NSString * firstName;
@property (copy) NSString * lastName;
- (NSString *)fullName;
@end
atomica o nonatomic, dovrai (ad esempio lock) un meccanismo di sincronizzazione se un thread sta leggendo da tale istanza e un altro sta scrivendo ad esso. Si può finire con una sola firstName di MONPerson e un altro è lastName - L'oggetto potrebbe essere cambiato prima che il valore di ritorno del getter è anche restituito a voi, o questo può accadere:
Discussione A:
p.firstName = @"Rob";
Discussione B :
p.firstName = @"Robert";
Discussione A:
label.string = p.firstName; // << uh, oh -- will be Robert
Se il "nome" della proprietà non era anatomico, tutti i thread nell'esempio precedente - A, B, C e D verranno eseguiti simultaneamente producendo risultati imprevedibili.
I sintomi iniziali di destra possono essere squilibri di conteggio di riferimento (perdita, sovra-rilascio).
In caso di atomico, uno di A, B o C verrà eseguito per primo ma D può ancora essere eseguito in parallelo. Si prega di commentare questo ....
Corretto.Ma se si guarda all'esempio di cui sopra - solo atomico è raramente un sostituto adatto per una serratura. Si dovrebbe assomigliare a questo, invece:
Discussione A:
[p lock]; // << wait for it… … … …
// Thread B now cannot access p
p.firstName = @"Rob";
NSString fullName = p.fullName;
[p unlock];
// Thread B can now access p
label.string = fullName;
Discussione B:
[p lock]; // << wait for it… … … …
// Thread A now cannot access p
…
[p unlock];
di accesso Atomic possono media oltre venti volte più lento di accessi nonatomic. Inoltre, se la classe ha bisogno di essere protetta da thread e ha uno stato mutabile, è probabile che si utilizzi un blocco quando opera in uno scenario concorrente. Il blocco corretto fornisce tutte le garanzie di cui hai bisogno: gli accessor atomici sono ridondanti in tale scenario, l'uso di atomics aggiungerebbe solo il tempo della CPU. Un altro aspetto positivo del blocco regolare è che hai tutta la granularità di cui hai bisogno - anche se è spesso più pesante dello spin lock usato per gli atomici, in genere avrai bisogno di meno acquisizioni quindi sarà molto veloce se usi correttamente i blocchi regolari .
http://www.google.com.ph/search?q = obiettivo + c + atomica + vs + nonatomic & aq = 0 & oq = obiettivo + c + atomica + vs + non & sugexp = cromo, mod = 10 & sourceid = cromo & ie = UTF-8 – janusbalatbat