In 32-bit ARM, the function above will be compiled to
ldr r2, [pc, #0x??] ; to retrieve the address of globalFloat
str r0, [r2] ; store value into globalFloat
As there are 2 instructions, and the CPU is free to perform anything between them, but only the second instruction str r0, [r2]
affects memory. Unless globalFloat
is unaligned, the CPU can perform single-copy atomic write to it.
The assignment can be non-atomic when the global pointer is unaligned. It is also non-atomic if you are writing to a larger structure e.g. CGRect.
Being atomic is not enough for thread safety. Due to caching and instruction reordering, your change may not be visible to other CPU cores. You may need to insert an OSMemoryBarrier()
to "publish" the change.
Atomic operations are usually interesting when it involves compound operations (e.g. globalFloat += value
). You may want to check out the built-in OSAtomic
library for it.