自旋锁实现中的 mov vs xchg

mov vs xchg in spin lock implementatoin

我正在通读这篇文章 online book on x86,我对他们实现自旋锁的示例代码中的实现细节感到好奇。在示例中,他们使用 xchg 将内存位置设置为 0 而不是 mov,我试图理解为什么做出这样的选择。

在自旋锁的例子中有一个函数,spinUnlock,它将0放入内存位置[sLock]。如果锁是空闲的,[sLock] 设置为 0,当锁被获取时,设置为 1spinUnlock 函数将 [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 dword [sLock],0就可以了; xchg eax, [sLock](隐含的 lock)可能更昂贵(对于性能和代码大小)。

该示例的所有代码都很糟糕(例如,在 spinLock 例程中没有 pause 应该使用它,尽管在不应该使用它的地方有 pause全部);他们选的例子也不好

注意:在 user-space 中使用自旋锁“几乎从不”明智,因为 OS 可能会在您获取锁之后但在释放锁之前进行任务切换,从而导致所有其他任务浪费大量 CPU 时间旋转而没有希望获得锁。