2010-03-31 7 views
5

Suppongo che su un dispositivo a 32 bit come l'iPhone, l'assegnazione di un float corto sia un'operazione atomica, thread-safe. Voglio assicurarmi che lo sia. Ho una funzione C che voglio chiamare da un thread di Objective-C, e io non voglio di acquisire un blocco prima di chiamare:Il single float assignment è un'operazione atomica su iPhone?

void setFloatValue(float value) { 
    globalFloat = value; 
} 

risposta

5

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.

+0

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

+2

Non ce n'è uno per l'assegnazione. –

+0

@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

3

Sì, sarà atomico. Su un'architettura a 32 bit, qualsiasi operazione di archivio su un tipo di dati primitivo di 32 bit o inferiore (char, short, int, long, float, ecc.) Sarà atomica.