gem*_*eld 59 c++ x86 assembly qt
我在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
Run Code Online (Sandbox Code Playgroud)
从谷歌搜索,我知道lock指令将导致CPU锁定总线,但我不知道CPU何时释放总线?
关于以上整个代码,我不明白这段代码是如何实现的Add?
Ant*_*ams 88
LOCK它本身不是指令:它是一个指令前缀,适用于以下指令.该指令必须的东西做对内存读-修改-写(INC,XCHG,CMPXCHG等)---在这种情况下它是incl (%ecx)哪个指令increments的l在举行的地址翁字ecx寄存器.
该LOCK前缀可确保CPU具有操作的持续时间适当的高速缓存线的独占所有权,并提供某些额外订购的保证.这可以通过断言总线锁来实现,但CPU会尽可能避免这种情况.如果总线被锁定,那么它仅在锁定指令的持续时间内.
此代码将要从堆栈递增的变量的地址复制到ecx寄存器中,然后lock incl (%ecx)将该变量原子递增1.接下来的两个指令将eax寄存器(保存函数的返回值)设置为0(如果变量的新值为0,否则为1.操作是增量,而不是添加(因此名称).
Dan*_*Dan 12
您可能无法理解的是,增加值所需的微代码要求我们首先读取旧值.
Lock关键字强制实际发生的多个微指令看起来以原子方式运行.
如果你有两个线程试图递增相同的变量,并且它们都同时读取相同的原始值,那么它们都会增加到相同的值,并且它们都写出相同的值.
而不是让变量递增两次,这是典型的期望,你最终会增加一次变量.
lock关键字可以防止这种情况发生.
Nec*_*lis 10
从谷歌,我知道锁定指令会导致cpu锁定总线,但我不知道什么时候cpu释放总线?
LOCK是一个指令前缀,因此它只适用于下面的指令,这里的源不是很明确,但真正的指令是LOCK INC.因此总线锁定增量,然后解锁
关于以上整个代码,我不明白这些代码如何实现Add?
如果旧值为0,则它们不实现Add,它们实现增量以及返回指示.将使用添加LOCK XADD(但是,InterlockedIncrement/Decrement也可以实现LOCK XADD).
| 归档时间: |
|
| 查看次数: |
36321 次 |
| 最近记录: |