Interlocked.CompareExchange(double,double,double)在32位操作系统中工作吗?

时间:2009-12-17 16:25:59

标签: .net multithreading locking interlocked

我正在维护一个可以由多个线程操作的高性能类。许多字段都是易失性的,因为事实证明我需要将其中一个升级为double。我很好奇是否有一种无锁的方法可以做到这一点,并且想知道Interlocked.CompareExchange(double, double, double)是否像在32位操作系统上宣传的那样工作,或者被撕裂是否有问题。

3 个答案:

答案 0 :(得分:2)

This page详细介绍了“原生”互锁函数的内在函数。它提到了以下限制

因为_InterlockedCompareExchange64使用cmpxchg8b指令,所以它不适用于奔腾前处理器,例如486。

因此我们可以预期它可用并且也可以作为互锁指令操作实现(而不是通过使用完全锁定来模拟)。

答案 1 :(得分:1)

是的,它的工作方式与32位相同。这就是Interlocked方法的用途。

答案 2 :(得分:0)

是的,它有效。

它使用InterlockedCompareExchange64 - 如果你想查看x86 asm中可能的实现,请看一下 - http://qc.embarcadero.com/wc/qcmain.aspx?d=6212

asm
//     ->          EAX     Destination 
//                 ESP+4   Exchange    
//                 ESP+12  Comperand   
//     <-          EDX:EAX Result      
          PUSH    EBX
          PUSH    EDI

          MOV     EDI, EAX

          MOV     EAX, DWORD PTR [Comperand]
          MOV     EDX, DWORD PTR [Comperand+4]

          MOV     EBX, DWORD PTR [Exchange]
          MOV     ECX, DWORD PTR [Exchange+4]

LOCK      CMPXCHG8B [EDI]

          POP     EDI
          POP     EBX
end;