如何将 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(@dComp)^);
请注意,您需要根据平台规范正确对齐变量。
正如@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方法会更好?
我有一个 double 值需要在 backgroundThread 中访问。我想使用像 AtomiccmpExchange
这样的想法,但接缝不能与双精度一起使用。他们是我可以与 double 一起使用的任何其他等价物吗?我想避免使用 Tmonitor.enter
/ Tmonitor.exit
因为我需要尽可能快的东西。我在 android/ios 下 所以在 firemonkey
您可以将 double
值转换为 UInt64
值:
PUInt64(@dOld)^ := AtomicCmpExchange(PUInt64(@d)^,PUInt64(@dNew)^,PUInt64(@dComp)^);
请注意,您需要根据平台规范正确对齐变量。
正如@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方法会更好?