在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 
  1. 从谷歌search,我知道lock指令将导致CPUlocking总线,但我不知道什么时候CPU释放总线?

  2. 关于整个上面的代码,我不明白这个代码如何实现Add

  1. LOCK不是一个指令本身:它是一个指令前缀,它适用于下面的指令。 该指令必须是对存储器( INCXCHGCMPXCHG等)进行读 – 修改 – 写操作的指令 – 在这种情况下,它是在所保存的地址处包含字的incl (%ecx)指令在ecx寄存器中。

    LOCK前缀确保CPU在操作期间拥有适当的caching行的独占所有权,并提供某些额外的订购保证。 这可以通过声明一个总线锁来实现,但是CPU将尽可能地避免这种情况。 如果总线被locking,那么只有在locking的指令期间。

  2. 这段代码将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。

锁关键字可以防止发生这种情况。