Interlocked.CompareExchange(double,double,double)在32位操作系统中工作吗?
问题描述:
我正在维护一个可以由多个线程操作的高性能类。许多领域是易变的整数,事实证明我需要将其中一个升级为双精度。我很好奇,如果有一种无锁的方式来做到这一点,并想知道Interlocked.CompareExchange(double, double, double)
是如何在32位操作系统上宣传的,或者是被撕毁的读取问题。Interlocked.CompareExchange(double,double,double)在32位操作系统中工作吗?
答
This page详细说明了“原生”互锁函数的内在性。它提到了以下限制
因为_InterlockedCompareExchange64使用CMPXCHG8B指令,它不适用于奔腾预处理器,如486
因此,我们可以预期,它是可用,也实现为互锁指令操作(而不是通过使用完全锁定进行模拟)。
答
是的,它的工作原理。
它使用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;
注意[QualityCentral现在已经关闭(https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward),所以你不能访问'qc.embarcadero .com'链接了。如果您需要访问旧的QC数据,请查看[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)。 – 2017-06-09 17:33:16