在多处理器中,我们知道lock inc mem
:锁可以确保没有其他操作可以访问该地址mem
。
但是当一个处理器mov eax,mem
首先执行,然后在它完成之前,第二个处理器执行lock inc mem
。
结果会怎样?
第二条指令 (
lock inc mem
) 等到第一条指令 ( )mov eax,mem
完成?(结果,首先会得到正确的值)两条指令同时执行。(因此,首先可能会得到一个无法预测的值)
在多处理器中,我们知道lock inc mem
:锁可以确保没有其他操作可以访问该地址mem
。
但是当一个处理器mov eax,mem
首先执行,然后在它完成之前,第二个处理器执行lock inc mem
。
结果会怎样?
第二条指令 ( lock inc mem
) 等到第一条指令 ( )mov eax,mem
完成?(结果,首先会得到正确的值)
两条指令同时执行。(因此,首先可能会得到一个无法预测的值)
如果 mem 是 32 位对齐的,则 mov 操作保证是原子的。引用软件开发者手册第 3A 卷:“一旦启动,处理器保证操作将在另一个处理器或总线代理被允许访问内存位置之前完成”
它mov EAX,[mem]
是原子的,因为它并行读取所有位。没有机会获得部分结果。它是在更新之前还是之后获得价值并不重要。
不同之inc [mem]
处在于它既读取又写入内存位置。如果你有两个并行运行,结果将是不可预测的,因为一个可能会覆盖另一个的结果。使用 alock
通过在整个指令期间声明总线来解决这个问题。其他人将不得不等待。