C# 在C语言中使用Volatile关键字#
我使用的是Volatile关键字,但它的行为方式与预期不同 这是我的密码C# 在C语言中使用Volatile关键字#,c#,task-parallel-library,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); priv
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);
private静态volatile int=0;
var up=Task.Run(()=>
{
对于(int i=0;i<1000000;i++)
_N++;
});
对于(int i=0;i<1000000;i++)
_N--;
起来,等等;
控制台写入线(N);
_N是一个类变量
每次我得到的是一个不同的数字,就好像没有使用关键字volatile一样。
这是关键字的正确行为吗
每次我得到的是一个不同的数字,就好像没有使用关键字volatile一样。这是关键字的正确行为吗
将变量指定为volatile不会使递增或递减操作原子化。假设您的循环是这样编写的:
for (int i = 0; i < 1000000; i++)
{
int x = _N;
x++;
_N = x;
}
for(int i=0;i<1000000;i++)
{
int x=\u N;
x++;
_N=x;
}
这实际上就是前面的循环——只是现在你在读,然后执行一个操作,然后写,这更清楚了。没有什么可以阻止另一个线程在这两个操作之间写入不同的值
对于原子性,应该使用和
就我个人而言,我会尽可能避免使用volatile
。在我看来,它的确切含义相对难以描述,也难以推理。最好尽可能使用更高级别的构造
每次我得到的是一个不同的数字,就好像没有使用关键字volatile一样。这是关键字的正确行为吗
将变量指定为volatile不会使递增或递减操作原子化。假设您的循环是这样编写的:
for (int i = 0; i < 1000000; i++)
{
int x = _N;
x++;
_N = x;
}
for(int i=0;i<1000000;i++)
{
int x=\u N;
x++;
_N=x;
}
这实际上就是前面的循环——只是现在你在读,然后执行一个操作,然后写,这更清楚了。没有什么可以阻止另一个线程在这两个操作之间写入不同的值
对于原子性,应该使用和
就我个人而言,我会尽可能避免使用
volatile
。在我看来,它的确切含义相对难以描述,也难以推理。如果可能,最好使用更高级别的结构。您是否假设volatile
关键字的性能与volatile.Write相同?您是否假设volatile
关键字的性能与volatile.Write相同?