变量赋值和读取原子操作?

时间:2010-04-29 10:28:10

标签: c# .net multithreading variable-assignment

我无法在文件中找到任何参考资料......

从线程的角度分配一个double(或任何其他简单类型,包括boolean)的原子操作?

double value = 0;

public void First() {
 while(true) {
  value = (new Random()).NextDouble();
 }
}

public void Second() {
 while(true) {
  Console.WriteLine(value);
 }
}

在此代码示例中,第一个方法在一个线程中调用,第二个方法在另一个线程中调用。如果第二种方法在另一个线程中赋值变量时获得执行,那么第二种方法是否可以获得混乱值?

我不在乎是否收到旧值,接收有效值(不是设置8个字节中的2个)的唯一重要。我知道这是一个愚蠢的问题,但我想确定,因为我不知道CLR如何实际设置变量。

1 个答案:

答案 0 :(得分:24)

要回答你的问题,不。对双打的分配不保证是原子的。文档可用here。基本上,< = 32位内置类型是原子的,> = 64位类型不是。对于64位类型的原子操作,您可以使用System.Threading.Interlocked

上的方法