2

是否应该将 double 或 long 变量声明为 volatile 以在 64 位操作系统和 64 位 cpu 中实现读\写原子性?对于 32 位操作系统和 32 位处理器也是如此吗?

4

2 回答 2

4

对此有两个答案,也不是您希望听到的:

  • 不,volatile保证原子性,所以如果你需要原子性,volatile不会帮助你。
  • 有或没有volatile,原子性实际上是由实现定义的。在几乎所有的 CPU 上,原生字大小的变量都是以原子方式读取和写入的(至少在它们正确对齐的情况下,通常是这种情况)。在 x86 上,较小的也可以原子访问。所以是的,在 x86 上,32 位变量将被原子读/写,而在 x86 上,64 位变量将被原子读/写。但同样,它取决于 CPU(和编译器)。
于 2012-04-15T10:55:59.477 回答
0

volatile在这里无济于事。如果一个操作是非原子的,它需要一个完整的锁来防止并发访问问题。

话虽如此,在 32 位系统上撕裂long变量是一个众所周知的问题,您可以找到示例来证明这一点(参见下面的链接)。

double变量也可能导致撕裂,但复制起来有点困难,因为浮点单元寄存器在 x86 系统上是 80 位的。看看这里:模拟在 C# 中撕开双倍以获得 Hans Passant 的一个很好的答案。

于 2012-04-15T13:15:53.030 回答