gpt4 book ai didi

iphone - 单个 float 分配是 iPhone 上的原子操作吗?

转载 作者:太空狗 更新时间:2023-10-30 03:50:21 24 4
gpt4 key购买 nike

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

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

最佳答案

在 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 可以对其执行单副本原子写入。

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

原子性不足以保证线程安全。由于缓存和指令重新排序,您的更改可能对其他 CPU 内核不可见。您可能需要插入 OSMemoryBarrier() 以“发布”更改。

原子操作在涉及复合操作时通常很有趣(例如 globalFloat += value)。您可能想查看内置的 OSAtomic它的库。

关于iphone - 单个 float 分配是 iPhone 上的原子操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2550992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com