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