我认为在像iPhone这样的32位设备上,分配一个短浮点是一个原子的,线程安全的操作。我想确定它是。我有一个C函数,我想从Objective-C线程调用,我不想在调用它之前获取一个锁:
void setFloatValue(float value) {
globalFloat = value;
}
答案 0 :(得分:5)
在32位ARM中,上述函数将编译为
ldr r2, [pc, #0x??] ; to retrieve the address of globalFloat
str r0, [r2] ; store value into globalFloat
由于有2条指令,CPU可以自由执行它们之间的任何操作,但只有第二条指令str r0, [r2]
会影响内存。除非globalFloat
未对齐,否则CPU可以对其执行单拷贝原子写入。
当全局指针未对齐时,赋值可以是非原子的。如果你写一个更大的结构,它也是非原子的,例如的CGRect。
原子是不够的线程安全。由于缓存和指令重新排序,您的更改可能对其他CPU核心不可见。您可能需要插入OSMemoryBarrier()
来“发布”更改。
当涉及复合操作时(例如globalFloat += value
),原子操作通常很有意思。您可能想要查看内置的OSAtomic
库。
答案 1 :(得分:3)
是的,它将是原子的。在32位体系结构上,对32位或更小(char,short,int,long,float等)的原始数据类型的任何存储操作都将是原子的。
答案 2 :(得分:0)
你的问题不仅仅是原子性。即使写入是原子的,也不能保证另一个线程会在没有某种内存障碍的情况下看到更改。这可能不是当前iPhone的问题,因为它们只有一个cpu,但它可能是台式机上的问题。
请参阅: