gpt4 book ai didi

c# - ConcurrentQueue c#,不准确的结果?

转载 作者:行者123 更新时间:2023-11-30 19:23:55 24 4
gpt4 key购买 nike

我想问一下c#中的queue如果 ConcurrentQueue 是安全线程,为什么这段代码的结果是 ~98 k?我有什么问题吗?

class Program
{
static int sum = 0;
static ConcurrentQueue<int> queue = new ConcurrentQueue<int>();

static void Main()
{
for (int i = 0; i < 100000; i++)
{
queue.Enqueue(1);
}

Task t1 = Task.Run(() => Calculate());
Task t2 = Task.Run(() => Calculate());

Task.WaitAll(t1, t2);

Console.WriteLine($"Sum = {sum}");
Console.ReadKey();
}

static void Calculate()
{

int result;
while (queue.TryDequeue(out result))
{
sum += result;
}
}
}

最佳答案

问题是:

sum += result;

那不是原子的。它是有效的:

var tmp = sum;
tmp += result;
sum = tmp;

如果你的两个线程同时到达中间线,你认为会发生什么?

您可以使用 Interlocked.Add 解决此问题:

while (queue.TryDequeue(out result))
{
Interlocked.Add(ref sum, result);
}

请注意,这与使用 ConcurrentQueue 无关 - 如果您的循环只是:

for (int i = 0; i < 50000; i++)
{
sum++; // Just as bad...
}

关于c# - ConcurrentQueue c#,不准确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43215713/

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