【发布时间】:2015-03-06 10:13:56
【问题描述】:
该指令可以与
LOCK前缀一起使用,以允许指令以原子方式执行。
我的问题是
-
CMPXCHG可以用内存地址操作吗?从文档中看似乎没有,但任何人都可以确认它只适用于寄存器中的实际值,而不是内存地址? -
如果
CMPXCHG不是原子的,并且必须通过LOCK CMPXCHG(带有LOCK前缀)实现高级语言级别的CAS,那么引入这样一条指令的目的到底是什么?
(我是从高级语言的角度来问的。也就是说,如果在x86平台上,无锁算法必须翻译成LOCK CMPXCHG,那么它仍然以LOCK为前缀。这意味着无锁算法是并不比那些精心编写的同步锁/互斥锁更好(至少在 x86 上)。这似乎也使裸 CMPXCHG 指令毫无意义,因为我猜引入它的主要目的是支持这种无锁操作。)
【问题讨论】:
-
显然你可以使用内存地址,这就是重点。第一个操作数的类型是 r/m,所以你去吧。如果它本身不存在,你怎么能在指令前面加上
lock? -
@harold 我不太明白什么不存在。如果您希望指令是原子的,请以 LOCK 为前缀。那么没有 LOCK 前缀的 CMPXCHG 是不是原子的?
-
不,但在您的问题 2 中,您似乎在问为什么存在“没有锁的 cmpxchg”,这有点奇怪,因为如果没有这些部件,组合就无法存在 - 如果那不是你那么你能澄清一下吗?
-
@harold 我是从高级语言的角度来问的。 IE。如果无锁算法必须在x86平台上翻译成LOCK CMPXCHG,那么它仍然以LOCK为前缀。这意味着无锁算法并不比精心编写的同步锁/ murex(至少在 x86 上)更好。这似乎使 CMPXCHG 指令毫无意义,因为我想引入它的主要目的是支持这种无锁操作。
-
@Alex Suo:您将高级锁与恰好被命名为
LOCK的低级 CPU 功能混为一谈。无锁算法试图避免的高级锁将不得不将线程置于等待状态,直到锁可用,这是一项代价高昂的操作,与 CPULOCK前缀功能完全不同,后者可能会持有其他线程只有一条指令。
标签: concurrency x86 atomic lock-free compare-and-swap