C# 使用参数创建新线程时索引超出范围?
我正在做一个关于烘焙算法的项目,但我没有任何C#语言的算法演示。由于这种情况,我转换了一些在维基百科上找到的java代码。但无论如何,它似乎不起作用 更新了:这是我的完整工作代码(旧代码包含在“/”注释中)C# 使用参数创建新线程时索引超出范围?,c#,multithreading,indexoutofboundsexception,C#,Multithreading,Indexoutofboundsexception,我正在做一个关于烘焙算法的项目,但我没有任何C#语言的算法演示。由于这种情况,我转换了一些在维基百科上找到的java代码。但无论如何,它似乎不起作用 更新了:这是我的完整工作代码(旧代码包含在“/”注释中) namespace算法 { 班级计划 { 静态int线程=10; 静态字符串x=“”; 静态整数计数=0; 静态int[]票证=新int[线程]; 静态bool[]输入=新bool[线程]; 公共静态void doLock(内部pid) { 输入[pid]=真; int max=0; 对于(
namespace算法
{
班级计划
{
静态int线程=10;
静态字符串x=“”;
静态整数计数=0;
静态int[]票证=新int[线程];
静态bool[]输入=新bool[线程];
公共静态void doLock(内部pid)
{
输入[pid]=真;
int max=0;
对于(int i=0;i票证[max]){max=i;}
}
票证[pid]=1+最大值;
输入[pid]=假;
对于(int i=0;i票证[i]||
(票证[pid]==票证[i]&&pid>i)))
{
螺纹屈服强度();
}
}
}
如果(x==“C”| | x==“C”)
Console.WriteLine(“[System]PID”+PID.ToString()+“进入临界区”);
}
公共静态无效解锁(int pid)
{
票证[pid]=0;
计数++;
Console.WriteLine(“[Thread]PID”+PID.ToString()+“进程已完成”);
}
公共静态void arrayInit()
{
对于(int i=0;isimThread(copy));
//导致我的问题的旧代码
//threadArray[i]=新线程(()=>simThread(i));
如果(x==“C”| | x==“C”)
Console.WriteLine(“[System]PID”+i.ToString()+”已创建”);
threadArray[i].Start();
睡眠(20);
}
Console.ReadLine();
Console.WriteLine(“---------------------------------------------”);
WriteLine(“进程完成”+count.ToString()+“线程!”);
计数=0;
Console.WriteLine(“---------------------------------------------”);
WriteLine(“是否要重新启动算法(C=Yes,K=No)”);
choice=Console.ReadLine();
如果(选项==“”)
choice=“C”;
}
}
}
}
这就是问题所在:
threadArray[i] = new Thread(() => simThread(i));
您在这里捕获的是i
——单个变量,该变量将在循环过程中更新,最终的值为threads
如果线程只在循环完成后执行lambda表达式的主体,那么该值基本上是不合适的。。。即使没有,您也可以轻松地使用相同的i
值创建多个线程
您基本上希望循环的每个迭代都有一个单独的变量,例如
for (int i = 0; i < threads; i++)
{
int copy = i;
threadArray[i] = new Thread(() => simThread(copy));
Console.WriteLine("[He Thong] PID " + i.ToString() + " duoc khoi tao");
threadArray[i].Start();
}
for(int i=0;isimThread(copy));
Console.WriteLine(“[He Thong]PID”+i.ToString()+“duoc khoi tao”);
threadArray[i].Start();
}
这样,循环的每次迭代都会捕获一个单独的变量,该变量的值为该迭代的i
,但随后不会更改
这是最小的变化
for (int i = 0; i < threads; i++)
{
int copy = i;
threadArray[i] = new Thread(() => simThread(copy));
Console.WriteLine("[He Thong] PID " + i.ToString() + " duoc khoi tao");
threadArray[i].Start();
}