MaP*_*aPi 1 c# task-parallel-library
我使用的是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);
Run Code Online (Sandbox Code Playgroud)
_N是一个类变量.
我得到的是每次都有一个不同的数字,好像没有使用关键字volatile.这是关键字的正确行为吗?
Jon*_*eet 11
我得到的是每次都有一个不同的数字,好像没有使用关键字volatile.这是关键字的正确行为吗?
将变量指定为volatile不会使递增或递减操作成为原子.想象一下你的循环是这样编写的:
for (int i = 0; i < 1000000; i++)
{
int x = _N;
x++;
_N = x;
}
Run Code Online (Sandbox Code Playgroud)
这实际上就是之前的循环 - 现在你正在阅读,然后执行操作,然后写作更清楚.没有什么可以阻止另一个线程在这两个操作之间写入不同的值.
对于原子性,你应该使用Interlocked.Increment和Interlocked.Decrement.
就个人而言,我会尽量避免使用volatile.它的确切含义相对难以描述,在我看来很难推理.最好在可能的情况下使用更高级别的构造.