gpt4 book ai didi

c# - 输出的时候发现currentId不是预期的10000。为什么?如何纠正

转载 作者:行者123 更新时间:2023-12-01 23:25:20 24 4
gpt4 key购买 nike

这段代码是我偶然看到的。代码大致如下。

    public class Question2
{
public void Run()
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10000; i++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
GetNextId();
}));
}
Task.WaitAll(tasks.ToArray());

Console.WriteLine("currentId=" + GetCurrentId());
Console.ReadKey();
}

private int currentId;
public int GetNextId()
{
currentId++;
return currentId;
}

public int GetCurrentId()
{
return currentId;
}
}

我不知道为什么结果不是 10000?谁能告诉我为什么以及如何纠正它。

最佳答案

您刚刚发现了线程安全主题! currentId++ 转换为

  1. 从内存中读取currentId的值
  2. 将这个值加一
  3. 将这个新值写回内存

现在假设您的循环只进行到 i < 3。第一个线程在第 1 步并读取值 0。在继续第 2 步之前,第二个线程在第 1 步并且也读取 0。现在两个线程转到第 3 步,会将两个 1 写入内存。现在第三个线程启动,将从内存中读取 1,将其递增到 2 并将其写入内存。现在你有 2 而不是预期值 3。

要解决此问题,您可以使用 Interlocked.Increment :

    private int currentId;
public int GetNextId()
{
return Interlocked.Increment(ref currentId);
}

但请注意,根据您的用例,当您使用 GetNextId() 的返回值时,您可能仍会遇到类似的问题。

关于c# - 输出的时候发现currentId不是预期的10000。为什么?如何纠正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67333482/

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