在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
Run Code Online (Sandbox Code Playgroud)
在哪种情况下,您需要后者的Load-Acquire/Store-Release语义?可以LDXR/ STXR指令重新排序吗?如果可以,原子更新是否有可能在没有障碍的情况下"丢失"?从我所读到的,似乎不会发生这种情况,如果是真的,那你为什么需要这个Barrier变体呢?也许只有你碰巧还需要一个DMB其他目的?
谢谢!