.net Interlocated.CompareExchange(double,double,double)是否在32位操作系统中工作?

.net Interlocated.CompareExchange(double,double,double)是否在32位操作系统中工作?,.net,multithreading,locking,interlocked,.net,Multithreading,Locking,Interlocked,我正在维护一个可以由多个线程操作的高性能类。许多字段都是易失性整数,事实证明,我需要将其中一个字段升级为双精度。我很好奇是否有一种无锁的方法可以做到这一点,我想知道是否是联锁的。CompareExchange(double,double,double)在32位操作系统上的广告效果,或者是有问题 是的,它的工作原理与32位上的描述相同。这就是这些方法的用途。详细介绍了“本机”互锁函数的内在特性。它提到了以下限制 由于_InterlocatedCompareeExchange64使用cmpxchg8

我正在维护一个可以由多个线程操作的高性能类。许多字段都是易失性整数,事实证明,我需要将其中一个字段升级为双精度。我很好奇是否有一种无锁的方法可以做到这一点,我想知道
是否是联锁的。CompareExchange(double,double,double)
在32位操作系统上的广告效果,或者是有问题

是的,它的工作原理与32位上的描述相同。这就是这些方法的用途。

详细介绍了“本机”互锁函数的内在特性。它提到了以下限制

由于_InterlocatedCompareeExchange64使用cmpxchg8b指令,因此它在奔腾之前的处理器(如486)上不可用

因此,我们可以预期它是可用的,也可以作为联锁指令操作实现(而不是通过使用全锁进行模拟)

是的,这很有效

它使用InterlockedCompareeExchange64-如果您想了解x86 asm中可能的实现,请查看此处-

asm
//->EAX目的地
//ESP+4交换
//ESP+12主持人
//请注意,这样您就不能再访问
qc.embarcadero.com
链接了。如果您需要访问旧的QC数据,请查看。
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;