如何避免在递归算法中达到线程池的最大值?

时间:2016-04-12 01:54:17

标签: c# multithreading testing thread-safety runtime-error

我有一个递归算法,每次创建两个新线程。当数组的长度为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?所以,我想我的下一个问题是,如何在不超过线程限制的情况下递归执行此操作?

1 个答案:

答案 0 :(得分:2)

由于您遗漏了大量代码,因此很难说,但是看起来行threads[0] = new Thread( MyDelegate );你有一个函数正在创建自己的新线程。你的程序会在递归创建线程时爆炸,直到内存不足为止。