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();
}