1

在大多数情况下doubledecimal64 位系统上的类型更新是原子操作,因为这些类型是 64 位的。(十进制是128位所以这是错误的,感谢评论)

但是当我在 64 位系统上更新double?和输入时,它会是原子的吗?decimal?大小是多少double?decimal?

我知道原子性不能保证,但我仍然感兴趣,如果这样的更新在一般情况下是原子的。

4

3 回答 3

11

在大多数情况下,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 团队提供并被证明是安全的更高级别的抽象。

于 2012-11-13T14:01:53.613 回答
4

我了解不能保证原子性

就是这样。不能保证。

如果这样的更新在一般情况下是原子的,我仍然感兴趣。

不能保证。

就像马克说的那样。

于 2012-11-13T14:02:15.027 回答
1

C# 规范允许将一个 64 位变量写为两个 32 位变量。

C# 语言保留将写入 long 等同于写入两个 int 的权利,一个接一个,在实践中,一些芯片确实以这种方式实现它

在此处查看 Eric Lippert 的更多信息

于 2012-11-13T14:10:07.533 回答