如何在Windows上自动交换两个指针?

时间:2010-12-21 20:32:28

标签: c++ windows

好的,我问的问题与this deleted question相同,但我更直接地问它。

我在同一个类的两个实例中有两个指针变量。我想原子地交换这些变量的内容(不是它们的POINT,只是变量本身)。

如果可能的话,我想避免锁定。

我该怎么做?

编辑:对于三个“InterlockedExchangePointer”的答案,请先阅读MSDN docs。 InterlockedExchangePointer使用堆栈寄存器上的值交换指针目标的值。它(本身)不会在内存位置交换两个指针。

3 个答案:

答案 0 :(得分:13)

我打算走出去,说你需要一个锁,并且没有一般情况下无锁解决这个问题。

您需要从两个地址读取并以原子方式回写这两个地址。据我所知,X86只能从单个内存地址和寄存器中自动交换数据。我认为不可能交换两个内存地址的内容。

如果可以对指针的位置设置约束,则可以执行此操作。例如,如果可以保证指针在内存中相邻,则可以在循环中使用64位或128位比较/交换。

可能有其他简单案例的解决方案,但我认为你不会为一般情况找到无锁解决方案。

答案 1 :(得分:2)

您正在寻找swap的原子互锁版本。

据我所知,没有办法只使用Windows API原语并且没有显式锁定。其他人推荐的Interlocked函数不起作用,因为只有一个传递参数被更改。你想要改变它们。

我也可能会指出Interlocked函数只相互关联。如果您有另一段代码更新其中一个指针但未使用Interlocked,则您的代码将不再安全。我相信你会意识到这一点,但我想我会提到它。

据我所知,您需要使用库或编写自己的代码来处理这个问题。

答案 2 :(得分:-2)

检查x86处理器xchg指令是否符合要求,然后将它们包装在内联汇编功能中。所有处理器单指令都保证是原子的。