in 32-bit ARM, la funzione di cui sopra sarà compilato a
ldr r2, [pc, #0x??] ; to retrieve the address of globalFloat
str r0, [r2] ; store value into globalFloat
Come ci sono 2 le istruzioni, e la CPU è libero di eseguire qualsiasi cosa tra di loro, ma solo la seconda istruzione str r0, [r2]
colpisce la memoria. A meno che globalFloat
non sia allineato, la CPU può eseguire la scrittura atomica a copia singola.
L'assegnazione può essere non atomica quando il puntatore globale non è allineato. È anche non atomico se stai scrivendo su una struttura più grande, ad es. CGRect.
Essere atomici non è sufficiente per la sicurezza del filo. A causa del caching e del riordino delle istruzioni, le modifiche potrebbero non essere visibili ad altri core della CPU. Potrebbe essere necessario inserire un OSMemoryBarrier()
per "pubblicare" la modifica.
Le operazioni atomiche sono di solito interessanti quando comportano operazioni composte (ad esempio globalFloat += value
). Si consiglia di controllare la libreria integrata OSAtomic
per esso.
Ma questo è ancora "un po sorta atomica", in quanto la scrittura reale per lo stato globale è una singola istruzione, quindi nessuno che guarda a globalFloat potrà mai vederlo in uno stato intermedio. – unwind
Non ce n'è uno per l'assegnazione. –
@unwind: è vero per qualsiasi istruzione del negozio. Lo stato intermedio qui è dopo che è stato letto e prima che sia scritto, quando la variabile esiste fisicamente in due posti (memoria e registro) contemporaneamente. – Potatoswatter