0

在 Intel x86 处理器上,是否可以在特定内存位置将一个值与另一个值进行比较,如果比较成功则重置内存而不用担心多线程/处理器问题?我看到了 CMPXCHG 指令——这行得通吗?还是有比较和设置用例的东西?

4

1 回答 1

0

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 既是 acompare-and-set又是 acompare-and-swap.

您必须使用LOCK前缀来确保 CMPXCHG 以原子方式执行,即执行 CMPXCHG 的线程在任何其他线程访问内存位置之前先读取然后写入内存位置。

您说resetting the memory if the compare succeeded如果您的意思是将内存位置设置为零,那么零就是您想要在源寄存器中的值。

对于在这个 SO questioncompare-and-swap中查看资源的便携方式

请注意,CMPXCHG 指令允许目标操作数既是寄存器也是内存位置。测试 8 个字节时,您将使用 CMPXCHG8B 指令。当您在 CMPXCHG8B 指令上指定前缀并将寄存器指定为目标时,Pentium 处理器中存在一个错误,您可以在此处LOCK阅读有关它的更多信息

于 2014-03-29T17:43:41.167 回答