在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
在解锁之前是否需要围栏指令才能刷新临界区内的商店操作?
答案 0 :(得分:0)
我没有故意检查您的代码的正确性:
螺旋锁已经是一个记忆围栏" (它只是部分内存刷新,因此它不是真正的内存栅栏),它同步已经读取和写入(否则它无法工作),所以如果自旋锁是正确的并且工作你将永远不需要额外的内存栅栏(至少只是一个无用的忏悔。)
这是一个概念性问题,在实施这些内容时,您应该了解有关您的架构的详细信息,尤其是"内存合同"单装配说明书。
内存防护有其他用途(比如允许C ++中的对象在开始在异步代码中使用它们之前完全初始化)