在大多数情况下double
,decimal
64 位系统上的类型更新是原子操作,因为这些类型是 64 位的。(十进制是128位所以这是错误的,感谢评论)
但是当我在 64 位系统上更新double?
和输入时,它会是原子的吗?decimal?
大小是多少double?
和decimal?
我知道原子性不能保证,但我仍然感兴趣,如果这样的更新在一般情况下是原子的。
在大多数情况下,64 位系统上的 double 和 decimal 类型更新是原子操作,因为这些类型是 64 位的。
不,decimal
从 128 位开始。另请注意,在 64 位计算机上运行并不一定意味着您正在运行 64 位 CLR。目前尚不清楚您在这里所说的“系统”是什么意思。
所以你甚至不应该假设decimal
. 即使在 64 位 CLR 上,我也不想依赖 的原子性double
,部分原因是它依赖于对齐。C# 规范明确指出(C# 4 规范的第 5.5 节):
其他类型的读取和写入,包括 long、ulong、double 和 decimal,以及用户定义的类型,不保证是原子的。
所以这使得可以为空的一面有点毫无意义,但是......
但是当我更新双重?和十进制?在 64 位系统上输入会是原子的吗?双倍的尺寸是多少?和十进制?
Nullable<T>
基本上是一个T
字段和一个bool
字段。所以存储空间将超过 64 位double
,超过 128 位decimal
。确切的存储很可能取决于上下文,但基本上我不希望这些类型的操作具有原子性。
正如其他人所说,您几乎肯定不想依赖任何没有保证的东西。就个人而言,我几乎总是尽量避免一般的无锁编码。尝试使用由 CLR/BCL 团队提供并被证明是安全的更高级别的抽象。
C# 规范允许将一个 64 位变量写为两个 32 位变量。
C# 语言保留将写入 long 等同于写入两个 int 的权利,一个接一个,在实践中,一些芯片确实以这种方式实现它
在此处查看 Eric Lippert 的更多信息