我正在维护一个可以由多个线程操作的高性能类。许多领域是易变的整数,事实证明我需要将其中一个升级为双精度。我很好奇,如果有一种无锁的方式来做到这一点,并想知道Interlocked.CompareExchange(double, double, double)
是如何在32位操作系统上宣传的,或者是被撕毁的读取问题。Interlocked.CompareExchange(double,double,double)在32位操作系统中工作吗?
2
A
回答
1
This page详细说明了“原生”互锁函数的内在性。它提到了以下限制
因为_InterlockedCompareExchange64使用CMPXCHG8B指令,它不适用于奔腾预处理器,如486
因此,我们可以预期,它是可用,也实现为互锁指令操作(而不是通过使用完全锁定进行模拟)。
1
是的,它的工作原理与32位一样。这就是Interlocked
方法。
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;
相关问题
- 1. 错误:无法在作业中将'double(evaluateator :: *)(double,double)'转换为'double(*)(double,double)'
- 2. 错误:无法在作业中将'double'转换为'double(double,double,double)'
- 3. double %% Python占位符如何工作
- 4. 无效的操作数到二进制表达式('double'和'double')
- 5. double + double = String?
- 6. 在int和double之间执行操作
- 7. double bool数组在C++中不工作
- 8. 如何从double加double返回double?
- 9. 如何实现double Pow(double base,double ex)
- 10. 将映射<double,tuple <double,double >>映射为<double,double> without loop?
- 11. 有什么办法在C#中将'Double'或'double'转换为'const Double'或'const double'?
- 12. C++将vector <pair <double,double >>转换为double *,double *?
- 13. double asterik操作符在这里如何工作?
- 14. 如何在Scala中将Array [(Double,Double)]转换为Array [Double]?
- 15. 在C++中实现double sqrt(double x)
- 16. 使用generic和double的操作
- 17. C++重载操作符double * Vec
- 18. double和'^'操作符,不可能?
- 19. ActiveMQ中的setBackOffMultiplier(double backOffMultiplier)如何工作
- 20. Double Click无法在标签上工作
- 21. 不能将'double'转换为'double(*)[5]'作为参数'1'到'void one_set_avrg(double(*)[5])'
- 22. vector <double> :: size_type与double
- 23. 写`double ...`而不是`[] double`
- 24. Assert Equals(double,double,delta)问题
- 25. Convert ArrayList <double[][]> double [] []
- 26. 休眠:将Double Double保存到数据库中作为Int
- 27. 如何使用期望RDD [(Double,Double)]作为Seq [Seq [(Double,Double)]]的输入的函数?
- 28. 语义问题对二进制表达式的操作数无效('double'和'double')
- 29. 32位/ 64位操作系统?
- 30. Double IF不起作用?
注意[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