如何将 AtomiccmpExchange 与 double 一起使用?

how to use AtomiccmpExchange with double?

我有一个 double 值需要在 backgroundThread 中访问。我想使用像 AtomiccmpExchange 这样的想法,但接缝不能与双精度一起使用。他们是我可以与 double 一起使用的任何其他等价物吗?我想避免使用 Tmonitor.enter / Tmonitor.exit 因为我需要尽可能快的东西。我在 android/ios 下 所以在 firemonkey

您可以将 double 值转换为 UInt64 值:

PUInt64(@dOld)^ := AtomicCmpExchange(PUInt64(@d)^,PUInt64(@dNew)^,PUInt64(@dCom‌​p)^); 

请注意,您需要根据平台规范正确对齐变量。


正如@David 指出的那样,比较 double 值与比较 UInt64 值不同。有一些特定的 double 值会表现得异常:

  • A NaN 通常(如 IEEE-754 中指定)通过自身比较值来检测。

    IsNaN := d <> d; 
    

    脚注:Delphi默认异常处理程序在比较 NaN 时被触发,但其他编译器的行为可能不同。在 Delphi 中有一个 IsNaN() 函数可供使用。

  • 同样,对于 special meaning,零值可以是正数也可以是负数。将 double 0 与 double -0 进行比较将 return 为真,但将内存占用量进行比较将 return 为假。

也许使用System.SyncObjs.TInterlockedclass方法会更好?