ARM64:LDXR/STXR与LDAXR/STLXR

前端之家收集整理的这篇文章主要介绍了ARM64:LDXR/STXR与LDAXR/STLXR前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在iOS上,有两个类似的功能,OSAtomicAdd32和OSAtomicAdd32Barrier.我想知道你什么时候需要Barrier变种.

拆卸后,它们是:

_OSAtomicAdd32:
ldxr    w8,[x1]
add     w8,w8,w0
stxr    w9,[x1]
cbnz    w9,_OSAtomicAdd32
mov     x0,x8
ret     lr

_OSAtomicAdd32Barrier:
ldaxr   w8,w0
stlxr   w9,_OSAtomicAdd32Barrier
mov     x0,x8
ret     lr

在哪种情况下,您需要后者的Load-Acquire / Store-Release语义? LDXR / STXR指令可以重新排序吗?如果可以,原子更新是否有可能在没有障碍的情况下“丢失”?从我读过的内容来看,似乎不会发生这种情况,如果是真的,那么为什么你需要Barrier变体呢?也许只有你也碰巧需要DMB用于其他目的?

谢谢!

解决方法

OSAtomicAdd32Barrier()适用于那些使用OSAtomicAdd()进行超出原子增量的人.具体来说,他们正在基于OSAtomicAdd()实现自己的多处理同步原语.例如,创建自己的互斥库. OSAtomicAdd32Barrier()使用重屏障指令在原子操作的两侧强制执行内存排序.这在正常使用中是不希望的.

总结一下:

1)如果您只想以线程安全的方式增加整数,请使用OSAtomicAdd32()

2)如果您遇到一堆愚蠢地认为OSAtomicAdd32()可以用作处理器内存排序和推测障碍的旧代码,请将其替换为OSAtomicAdd32Barrier()

猜你在找的Java相关文章