【发布时间】:2021-01-22 19:07:43
【问题描述】:
我正在阅读这个online book on x86,我很好奇他们用于实现自旋锁的示例代码中的实现细节。在示例中,他们使用 xchg 将内存位置设置为 0 而不是 mov,我试图理解为什么会做出这样的选择。
在自旋锁示例中,有一个函数spinUnlock 将0 放入内存位置[sLock]。 [sLock] 被设置为 0 如果锁是空闲的,1 被获取时。 spinUnlock 函数将 [sLock] 设置为 0 以释放锁。代码如下:
spinUnlock:
push ebp
mov ebp, esp
mov eax, 0
xchg eax, [sLock]
pop ebp
ret
为什么使用mov eax, 0; xchg eax, [sLock] 将[sLock] 设置为0 而不是mov [sLock], 0?在调用spinUnlock 之后,eax 寄存器不用于任何操作。我知道xchg 会锁定内存位置,但如果mov 已经是原子的,则不需要锁定。
【问题讨论】:
-
mov是原子的,但不会强加内存排序。xchg是后者。