在x86汇编中,“lock”指令是什么意思?
我在Qt的源文件中看到了一些x86汇编:
q_atomic_increment: movl 4(%esp), %ecx lock incl (%ecx) mov $0,%eax setne %al ret .align 4,0x90 .type q_atomic_increment,@function .size q_atomic_increment,.-q_atomic_increment
-
从谷歌search,我知道
lock
指令将导致CPUlocking总线,但我不知道什么时候CPU释放总线? -
关于整个上面的代码,我不明白这个代码如何实现
Add
?
-
LOCK
不是一个指令本身:它是一个指令前缀,它适用于下面的指令。 该指令必须是对存储器(INC
,XCHG
,CMPXCHG
等)进行读 – 修改 – 写操作的指令 – 在这种情况下,它是在所保存的地址处包含字的incl (%ecx)
指令在ecx
寄存器中。LOCK
前缀确保CPU在操作期间拥有适当的caching行的独占所有权,并提供某些额外的订购保证。 这可以通过声明一个总线锁来实现,但是CPU将尽可能地避免这种情况。 如果总线被locking,那么只有在locking的指令期间。 -
这段代码将
ecx
堆栈中增加的variables的地址复制到ecx
寄存器中,然后lock incl (%ecx)
以便将该variables自动递增1.接下来的两条指令设置eax
寄存器(保存返回值如果variables的新值为0,则为0,否则为1。 该操作是一个增量 ,而不是一个添加(因此名称)。
从谷歌,我知道locking指令将导致CPUlocking公共汽车,但我不知道什么时候CPU免费巴士?
LOCK
是一个指令前缀,因此它只适用于下面的指令,这里的源代码不是很清楚,但是实际的指令是LOCK INC
。 所以总线locking为增量,然后解锁
关于整个上面的代码,我不明白这些代码是如何实现的Add?
他们没有实现一个Add,他们实现了一个增量,同时还有一个返回指示,如果旧值为0.一个增加将使用LOCK XADD
(但是,InterlockedIncrement / Decrement也可以用LOCK XADD
实现)。
你可能无法理解的是,增加一个值所需的微码要求我们先读取旧值。
Lock关键字强制实际发生的多个微指令看起来像primefaces一样操作。
如果您有两个线程,每个线程都尝试增加相同的variables,并且它们都在同一时间读取相同的原始值,那么它们都增加到相同的值,并且它们都写出相同的值。
而不是variables增加两次,这是典型的期望,你最终增加一次variables。
锁关键字可以防止发生这种情况。