gpt4 book ai didi

c# - 在 C# 中使用 Volatile 关键字

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:45 25 4
gpt4 key购买 nike

我正在使用 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 一样。这是关键字的正确行为吗?

最佳答案

What I get is a different number every time, as if the keyword volatile were not used. Is it the right behaviour of the keyword?

将变量指定为 volatile 不会使递增或递减操作成为原子。想象一下你的循环是这样写的:

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

那是有效之前的循环 - 只是现在更清楚您正在读取,然后执行操作,然后写入。没有什么可以阻止另一个线程在这两个操作之间写入不同的值。

对于原子性,你应该使用Interlocked.IncrementInterlocked.Decrement .

就我个人而言,我会尽可能避免使用 volatile。它的确切含义相对难以描述,在我看来也很难推理。最好尽可能使用更高级别的构造。

关于c# - 在 C# 中使用 Volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19294531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com