在ARM指令集中,没有原子交换指令.相反,你使用ldrex和strex代码如下:
@ exchange r0 and [r1]
ldrex r2,[r1]
strex r3, r0,[r1]
mov r0,r2
Run Code Online (Sandbox Code Playgroud)
当[r1]在ldrex和之间修改时,strex或者由于某些其他原因无法保证交换是原子的,则返回1 r3并且不执行存储.如果序列是原子序列,则返回0.因此,通过在循环中执行此片段直到获得零,r3您最终可以达到原子交换操作.这实际上是gcc和clang如何实现相应的内在因素; 传递-S给编译器来观察它的作用.