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