2010-04-29 75 views
35

我无法在文档中找到对此的任何引用...是变量赋值和读取原子操作吗?

是分配给双线(或任何其他简单类型,包括布尔值)从线程角度查看的原子操作吗?

double value = 0; 

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

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

在此代码示例中,第一个方法在一个线程中调用,第二个方法在另一个线程中调用。如果第二个方法在赋值给另一个线程中的变量时得到它的执行,第二个方法会得到一个混乱的值吗?

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

+27

上的方法这不是一个愚蠢的问题。 – 2010-04-29 14:17:57

+0

@EricLippert对象a = 10;这是一个原子操作呢?我已阅读MSDN,您的文章等,但似乎无法找到答案。因为它涉及2个步骤。拳击,然后分配 – Ehsan 2013-08-23 07:25:19

+0

@NoOne:变量'a'的变异是原子的,因为'object'是一个引用类型。拳击没有进入它。 – 2013-08-23 13:48:46

回答

24

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