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

ite*_*ter 5 c iphone multithreading objective-c

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

void setFloatValue(float value) {
    globalFloat = value;
}
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 5

在32位ARM中,上面的函数将被编译为

ldr r2, [pc, #0x??]  ; to retrieve the address of globalFloat
str r0, [r2]         ; store value into globalFloat
Run Code Online (Sandbox Code Playgroud)

由于有2条指令,CPU可以在它们之间自由执行任何操作,但只有第二条指令str r0, [r2]会影响内存.除非globalFloat未对齐,否则CPU可以对其执行单拷贝原子写入.

当全局指针未对齐时,赋值可以是非原子的.如果您正在写一个更大的结构,例如CGRect,它也是非原子的.

原子是不够的线程安全.由于缓存和指令重新排序,您的更改可能对其他CPU核心不可见.您可能需要插入一个OSMemoryBarrier()"发布"更改.

当涉及复合操作(例如globalFloat += value)时,原子操作通常是有趣的.您可能想要查看内置OSAtomic库.

  • 它不是那种原子的.它完全是原子的.第一条指令根本不与值交互,它只是将其地址加载到r2中.@Potatoswatter,问题不在于变量是否同时存在于两个或多个位置(可以说是char),但是当另一个线程尝试读取该值时,该值是否可以被一个线程部分写入内存位置.在上面的代码中永远不会发生这种情况. (5认同)
  • 没有一个可以分配. (2认同)