3

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

4

3 回答 3

2

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

因为 _InterlockedCompareExchange64 使用 cmpxchg8b 指令,所以它在 Pentium 之前的处理器上不可用,例如 486。

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

于 2009-12-17T16:40:16.200 回答
1

是的,它按照 32 位的描述工作。这就是这些Interlocked方法的用途。

于 2009-12-17T16:27:40.447 回答
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;
于 2011-07-07T10:14:40.497 回答