.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;