如何在 F# 中将十进制数写为原子写?

how to write decimal numbers as an atomic write in F#?

十进制类型占128位,自然不是原子写

我试过:

Interlocked.Exchange(ref myField, some new value)

但后来我发现小数不是 Interlocked.Exchange 支持的类型的一部分。

我在想,对于这次写入来说,做一个锁可能有点重。还有其他选择吗?

正如您所说,Interlocked.Exchange 只能使用 32 位或 64 位值,因此不支持 decimal。除了使用锁,一个建议 from a related C# Whosebug post 是将值包装在一个对象中,然后使用 Interlocked.Exchange 交换对象引用。在 F# 中,这看起来像这样:

type Boxed<'T when 'T : struct>(v:'T) = 
  member x.Value = v

let mutable d1 = Boxed(1M)
let d2 = Boxed(2M)

Interlocked.Exchange(&d1, d2)

问题是额外实例的开销是否大于使用 lock 的开销 - 我认为这将取决于您的具体情况。如果您只有几位小数,那么额外的对象可能不是什么大问题,但您可能需要 运行 一些测试才能找出答案。