单浮动分配是iPhone上的原子操作吗?

时间:2010-03-31 06:55:05

标签: iphone c objective-c multithreading

我认为在像iPhone这样的32位设备上,分配一个短浮点是一个原子的,线程安全的操作。我想确定它是。我有一个C函数,我想从Objective-C线程调用,我不想在调用它之前获取一个锁:

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

3 个答案:

答案 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,但它可能是台式机上的问题。

请参阅: