在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@