加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

ARM64:LDXR/STXR与LDAXR/STLXR

发布时间:2020-12-14 23:47:20 所属栏目:Java 来源:网络整理
导读:在iOS上,有两个类似的功能,OSAtomicAdd32和OSAtomicAdd32Barrier.我想知道你什么时候需要Barrier变种. 拆卸后,它们是: _OSAtomicAdd32:ldxr w8,[x1]add w8,w8,w0stxr w9,[x1]cbnz w9,_OSAtomicAdd32mov x0,x8ret lr_OSAtomicAdd32Barrier:ldaxr w8,w0stlxr
在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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读