C#多线程中的变量值不一致
我正在尝试学习如何在C#中使用多线程。我从开始工作,这解释了如何使用lambda表达式传递参数。我建立了一个玩具程序来测试这一点,但我对输出感到困惑 这是我的密码:C#多线程中的变量值不一致,c#,multithreading,C#,Multithreading,我正在尝试学习如何在C#中使用多线程。我从开始工作,这解释了如何使用lambda表达式传递参数。我建立了一个玩具程序来测试这一点,但我对输出感到困惑 这是我的密码: using System; using System.Threading; namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread(int id)
using System;
using System.Threading;
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread(int id)
{
Console.WriteLine(string.Format("Child thread {0} starts", id));
}
static void Main(string[] args)
{
for (int i=0; i<10; i++)
{
Console.WriteLine(string.Format("i: {0}", i));
Thread childThread = new Thread( () => CallToChildThread (i) );
childThread.Start();
}
}
}
}
子函数只打印它所传递的id的值。我希望这些值的范围是0到9,但是
CallToChildThread
显示的是1到10。有人能解释一下原因吗?我刚刚运行了这个程序,结果如下:
i: 0
i: 1
i: 2
Child thread 2 starts
i: 3
Child thread 2 starts
Child thread 3 starts
i: 4
Child thread 4 starts
Child thread 4 starts
i: 5
i: 6
i: 7
Child thread 7 starts
Child thread 7 starts
i: 8
i: 9
Child thread 9 starts
Child thread 9 starts
Child thread 10 starts
这很好地说明了多线程的一个问题:共享变量。在这方面:
Thread childThread = new Thread( () => CallToChildThread (i) );
假设您创建了一个当前值为i
的lambda。你没有。创建一个lambda,引用循环变量i
。只有当您的子线程到达CallToChildThread
的开头时(可能在稍后的某个时间发生),才会计算i
的值并将其复制到局部变量id
解决方法很简单:
int _i = i;
Thread childThread = new Thread(() => CallToChildThread(_i));
这将产生子线程0到9。这已被多次询问。我已将你的问题标记为重复问题。使用术语“关闭循环变量”@SriramSakthivel进行搜索-感谢您提供的信息。主要问题是知道要搜索什么。即使你提到了正确的术语,“结束循环变量”对我来说也不明显。不用担心。发生了:)
int _i = i;
Thread childThread = new Thread(() => CallToChildThread(_i));