C# For循环与多线程控制台writeline

C# For循环与多线程控制台writeline,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我有一个代码如下: for (int i = 0; i < 10; i++) { new Thread(() => Console.WriteLine(i)).Start(); } 在我看来,经过10次迭代之后,i的最大值应该是9。 我知道多线程会导致不正确的输出,但最大值是如何工作的?在启动线程后,您应该小心不要意外地修改捕获的变量,如I,因为I是共享的。因此,将i复制到局部变量,如下所示: for (int i = 0; i < 10; i++) {

我有一个代码如下:

for (int i = 0; i < 10; i++)
{
     new Thread(() => Console.WriteLine(i)).Start();
}
在我看来,经过10次迭代之后,i的最大值应该是9。
我知道多线程会导致不正确的输出,但最大值是如何工作的?

在启动线程后,您应该小心不要意外地修改捕获的变量,如
I
,因为
I
是共享的。因此,将
i
复制到局部变量,如下所示:

for (int i = 0; i < 10; i++)
{
     var i1 = i;
     new Thread(() => Console.WriteLine(i1)).Start();
}
for(int i=0;i<10;i++)
{
var i1=i;
新线程(()=>Console.WriteLine(i1)).Start();
}

在这里阅读有关闭包的更多信息:

您应该小心,不要在启动线程后意外修改捕获的变量,如
i
,因为
i
是共享的。因此,将
i
复制到局部变量,如下所示:

for (int i = 0; i < 10; i++)
{
     var i1 = i;
     new Thread(() => Console.WriteLine(i1)).Start();
}
for(int i=0;i<10;i++)
{
var i1=i;
新线程(()=>Console.WriteLine(i1)).Start();
}

在这里阅读有关闭包的更多信息:

它被称为捕获变量,这正是我们要讨论的问题

以下是他的总结:

问题是i变量引用了相同的内存位置 在循环的整个生命周期中。因此,每个线程调用 控制台。写一个变量,它的值在运行时可能会改变

解决方案是使用一个临时变量,如下所示:

for(int i=0;i<10;i++)
{
int-temp=i;
新线程(()=>Console.Write(temp)).Start();
}
变量temp现在是每个循环迭代的局部变量。因此, 线程捕获一个不同的内存位置,没有问题


它被称为捕获变量,这正是我们要讨论的问题

以下是他的总结:

问题是i变量引用了相同的内存位置 在循环的整个生命周期中。因此,每个线程调用 控制台。写一个变量,它的值在运行时可能会改变

解决方案是使用一个临时变量,如下所示:

for(int i=0;i<10;i++)
{
int-temp=i;
新线程(()=>Console.Write(temp)).Start();
}
变量temp现在是每个循环迭代的局部变量。因此, 线程捕获一个不同的内存位置,没有问题


for
循环中,
i
的最大值为9。当
i
不再小于10时,循环结束,因此循环后
i
为10


一些线程是在循环完成之前启动的,这就是为什么会得到从3到8的结果。循环完成后启动了两个线程,因此您得到了10个线程。

for
循环中,
i
的最大值为9。当
i
不再小于10时,循环结束,因此循环后
i
为10

一些线程是在循环完成之前启动的,这就是为什么会得到从3到8的结果。循环完成后启动了两个线程,因此得到了10个线程

for (int i = 0; i < 10; i++)
{
  int temp = i;
  new Thread (() => Console.Write (temp)).Start();
}