1

在 x86-64 上,我对关键部分使用简单的自旋锁:

mov al,1
LoopWait:
    xchg byte ptr[mlock], al
    test al,al
    jz Free
    pause
jmp LoopWait
Free:

并退出cs:

mov byte ptr[mlock], 0

在解锁之前是否需要栅栏指令,以便刷新临界区中的存储操作?

4

1 回答 1

0

我不是故意检查您的代码的正确性:

自旋锁已经是一个“内存栅栏”(它只是进行部分内存刷新,所以它不是真正的内存栅栏),它同步已经读取和写入(否则它无法工作),所以如果自旋锁是正确的并且工作你永远不需要额外的内存围栏(这只是一种无用的惩罚)。

这是一个概念问题,在实现这些东西时,您应该了解有关您的体系结构的详细信息,尤其是单个汇编指令的“内存契约”。

内存栅栏还有其他用途(比如允许 C++ 中的对象在开始在异步代码中使用它们之前完全初始化)

于 2015-10-15T12:49:24.783 回答