ARM64:LDXR/STXR与LDAXR/STLXR

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

拆卸后,它们是:@H_301_3@ @H_502_4@_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用于其他目的?@H_301_3@

谢谢!@H_301_3@

解决方法

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

总结一下:@H_301_3@

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

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

原文链接:https://www.f2er.com/java/127362.html

猜你在找的Java相关文章