C# 在循环中创建新线程
我试图理解为什么这个代码不起作用C# 在循环中创建新线程,c#,multithreading,C#,Multithreading,我试图理解为什么这个代码不起作用 private static object _lock; public static void Main (string[] args) { Thread thread; _lock = new object(); foreach (int num in Enumerable.Range(0,5)) { thread = new Thread (() =>
private static object _lock;
public static void Main (string[] args)
{
Thread thread;
_lock = new object();
foreach (int num in Enumerable.Range(0,5)) {
thread = new Thread (() => print(num.ToString()));
thread.Start();
}
}
public static void print(string text)
{
lock(_lock)
{
Console.WriteLine(text);
}
}
我得到的结果是
四,
1.
4.
4.
三,
或任何其他随机数字。为什么它会重复数字?因为每个线程都引用循环变量,并且在创建线程时不会获得自己的副本 请注意,编译器警告您:“访问修改的闭包”
你的锁根本不起任何作用;只有一个线程锁定在该对象上,即启动其他线程的线程。其他线程根本就不会争夺锁。哦,我的天啊,当然。非常感谢你。我不敢相信我没有意识到这一点。海报说明:C#中的for-each和闭包有点“抓到”(for-each中引入的变量是每个循环中相同的变量):这将“修复它”:
foreach(int-num-in…{int-num=\u-num;/*相同的*/}
是的,但原因是什么?;-)
foreach (int num in Enumerable.Range(0,5))
{
int loopnum = num;
thread = new Thread(() => print(loopnum.ToString()));
thread.Start();
}