2013-10-10 108 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。在我看来,它的含义较难描述,难以推理。尽可能使用更高层次的构造。