释放锁之前的内存栅栏

时间:2015-10-15 12:39:49

标签: multithreading assembly synchronization critical-section memory-fences

在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

在解锁之前是否需要围栏指令才能刷新临界区内的商店操作?

1 个答案:

答案 0 :(得分:0)

我没有故意检查您的代码的正确性:

螺旋锁已经是一个记忆围栏" (它只是部分内存刷新,因此它不是真正的内存栅栏),它同步已经读取和写入(否则它无法工作),所以如果自旋锁是正确的并且工作你将永远不需要额外的内存栅栏(至少只是一个无用的忏悔。)

这是一个概念性问题,在实施这些内容时,您应该了解有关您的架构的详细信息,尤其是"内存合同"单装配说明书。

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