【发布时间】:2014-03-29 17:22:44
【问题描述】:
在 Intel x86 处理器上,是否可以在特定内存位置将一个值与另一个值进行比较,如果比较成功则重置内存而不用担心多线程/处理器问题?我看到了 CMPXCHG 指令——这行得通吗?或者有没有比较和设置用例的东西?
【问题讨论】:
标签: assembly x86 compare-and-swap
在 Intel x86 处理器上,是否可以在特定内存位置将一个值与另一个值进行比较,如果比较成功则重置内存而不用担心多线程/处理器问题?我看到了 CMPXCHG 指令——这行得通吗?或者有没有比较和设置用例的东西?
【问题讨论】:
标签: assembly x86 compare-and-swap
CMPXCHG 指令将隐含寄存器 (EAX) 中的值与目标进行比较,并更新零标志 (EFLAGS.ZF) 以指示目标中的值是否与 EAX 中给出的值匹配,在这种情况下,源操作数(显式寄存器)存储在目标中。 CMPXCHG 还使用从目标读取的值更新 EAX。
Wikipedia 将compare-and-set 描述为compare-and-swap 的变体,您可以在其中获得真/假指示,表明内存位置的数据是否与给定值匹配,以及内存位置是否已更新。 compare-and-swap 替代方案返回从内存中读取的内容,您可以自己与给定的值进行比较。
http://en.wikipedia.org/wiki/Compare-and-set
...重定向到
http://en.wikipedia.org/wiki/Compare-and-swap
在这个意义上 CMPXCHG 既是 compare-and-set 也是 compare-and-swap.
您必须使用LOCK 前缀来确保 CMPXCHG 以原子方式执行,即执行 CMPXCHG 的线程在任何其他线程访问内存位置之前先读取并写入内存位置。
你说resetting the memory if the compare succeeded如果你的意思是将内存位置设置为零,那么零就是你想要在源寄存器中的值。
有关进行compare-and-swap 的可移植方式,请参阅this SO question 中的资源
注意 CMPXCHG 指令允许目标操作数既是寄存器也是内存位置。测试 8 个字节时,您将使用 CMPXCHG8B 指令。当您在 CMPXCHG8B 指令上指定 LOCK 前缀并指定寄存器作为目标时,奔腾处理器中存在一个错误,您可以阅读有关它的更多信息here
【讨论】: