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)
在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库.
| 归档时间: |
|
| 查看次数: |
1420 次 |
| 最近记录: |