在 iOS 上,有两个类似的功能,OSAtomicAdd32
和OSAtomicAdd32Barrier
. 我想知道你什么时候需要这个Barrier
变体。
拆开后分别是:
_OSAtomicAdd32:
ldxr w8, [x1]
add w8, w8, w0
stxr w9, w8, [x1]
cbnz w9, _OSAtomicAdd32
mov x0, x8
ret lr
_OSAtomicAdd32Barrier:
ldaxr w8, [x1]
add w8, w8, w0
stlxr w9, w8, [x1]
cbnz w9, _OSAtomicAdd32Barrier
mov x0, x8
ret lr
在哪些情况下您需要后者的 Load-Acquire / Store-Release 语义?LDXR
/STXR
指令可以重新排序吗?如果可以,原子更新是否有可能在没有障碍的情况下“丢失”?从我读过的内容来看,这似乎不会发生,如果是真的,那你为什么需要这个Barrier
变体?也许只有当你也碰巧需要一个DMB
用于其他目的的时候?
谢谢!