我有一个递归算法,每次创建两个新线程。当数组的长度为100k时,我的测试会因以下错误而崩溃。我相信这超出了线程池和/或内存不足。
现在的问题是,如何重新设计算法以防止崩溃?
测试编写和执行框架:TE.ProcessHost.Managed [v5.3-1509]已停止工作
public class MyParamObj
{
public int[] MyArray;
public int MyIntOne;
public int MyIntTwo;
public static Create( int[] myArray, int myIntOne, int myIntTwo )
{
return new MyParamObj
{
MyArray = myArray,
MyIntOne = myIntOne,
MyIntTwo = myIntTwo
};
}
}
public class MyClass
{
public void Entry( int[] myArray)
{
int intOne = 0;
int intTwo = myArray.Length;
MyDelegate( MyParamObj.Create( myArray, intOne, intTwo) );
}
private void MyDelegate( object paramaObject )
{
var parameters = paramaObject as MyParamObjCreate;
if (parameters == null) throw new ArgumentNullException(nameof(parameters));
// just sample values
int intOne = 0;
int intTwo = 0;
int intThree = 0;
int intFour = 0
var threadOneParams = MyParamObj.Create( parameters.MyArray, intOne, intTwo );
var threadTwoParams = MyParamObj.Create( parameters.MyArray, intThree, intFour );
var threads = new Thread[2];
threads[0] = new Thread( MyDelegate );
threads[1] = new Thread( MyDelegate );
threads[0].Start(threadOneParams);
threads[1].Start(threadTwoParams);
threads[0].Join();
threads[1].Join();
//reorder elements within the array
}
}
更新3
我认为我超出了线程池的最大限制。当我有一个100k长的数组并且我递归到大小为1时,我认为我将拥有100k +线程。 Maximum number of threads in a .NET app?所以,我想我的下一个问题是,如何在不超过线程限制的情况下递归执行此操作?
答案 0 :(得分:2)
由于您遗漏了大量代码,因此很难说,但是看起来行threads[0] = new Thread( MyDelegate );
你有一个函数正在创建自己的新线程。你的程序会在递归创建线程时爆炸,直到内存不足为止。