2010-04-29 35 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