2013-10-10 71 views
1

我正在使用Volatile關鍵字,但它的行爲與預期的不同。在C#中使用Volatile關鍵字

這裏是我的代碼

private static volatile int _N = 0; 



var up = Task.Run(() => 
{ 
    for (int i = 0; i < 1000000; i++) 
     _N++; 
}); 
for (int i = 0; i < 1000000; i++) 
    _N--; 
up.Wait(); 
Console.WriteLine(_N); 

_N是一個類變量。

我每次得到的是不同的數字,就好像關鍵字volatile不被使用一樣。 這是關鍵字的正確行爲嗎?

+0

你是否假設'volatile'關鍵字的功能與'Volatile.Write'相同? –

回答

11

我每次得到的數字都是不同的數字,就好像關鍵字volatile沒有被使用一樣。這是關鍵字的正確行爲嗎?

將變量指定爲volatile不會使增量或減量操作原子。試想一下,你的循環已經這樣寫的:

for (int i = 0; i < 1000000; i++) 
{ 
    int x = _N; 
    x++; 
    _N = x; 
} 

這是有效什麼以前的循環是 - 這只是現在它的更清楚,你正在閱讀,然後進行操作,然後寫。沒有什麼能夠阻止另一個線程在這兩個操作之間寫入不同的值。

對於原子性,您應該使用Interlocked.IncrementInterlocked.Decrement

我個人會盡量避免使用volatile。在我看來,它的含義較難描述,難以推理。儘可能使用更高層次的構造。