2016-04-12 5 views
0

私は毎回2つの新しいスレッドを作成する再帰的なアルゴリズムを持っています。私のテストは、配列の長さが100kのときに次のエラーでクラッシュします。私はこれがスレッドプールを超えていて、メモリが足りなくなっていることを信じています。どのように再帰アルゴリズムでスレッドプールの最大に達するのを避けるには?

ここで質問すると、クラッシュしないようにアルゴリズムを再設計する方法はありますか?

テストオーサリングおよび実行フレームワーク:TE.ProcessHost.Managedは[v5.3-1509]私は超えると思うアップデート3

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 
    } 
} 

動作を停止しましたスレッドプールの最大限度。 100kの配列を持ち、再帰的に1のサイズになると、私は100k +のスレッドを持つでしょう。 Maximum number of threads in a .NET app?だから、私は次の質問を思います、スレッド制限を超えないでこの操作を再帰的に行う方法はありますか?

+0

コードをコピーしてVSまたはLINQPadにコピーして実行できるようにしてください。今はエラーがいっぱいです。あなたは本当に[mcve]を投稿する必要があります。そうでなければ、この質問は答えられません。 – Enigmativity

+0

@Enigmativityメソッド署名を 'v'に固定し、intのデフォルト値を追加しました。私はそれが今コンパイルされるべきだと考えていますが、それはこの時点で、そして実装の問題の理論的な問題です。 – JacobVoller

+0

コードはまだコンパイルされませんが、コンパイルするにはあまり時間がかかりませんでした。あなたがここに質問を書くとき、私たちがそれに答えるのを助けるためにできるだけ多くの仕事をするべきです。いずれにしても、私が実行したときに例外が発生しました。 "タイプ 'System.OutOfMemoryException'の例外がスローされました。"すべてのスレッドのためにRAMを使い果たした無限に再帰的なメソッドを作成しました。このコードは、 'int'の配列がスレッドセーフであるかどうかには関係ありません。あなたはそれがそうするように修正できますか? – Enigmativity

答えて

2

巨大なコードを除外しているので、わかりにくいですが、threads[0] = new Thread(MyDelegate);という行のように、新しいスレッドを作成しているようです。プログラムがメモリ不足になるまで、再帰的にスレッドを作成するので、プログラムは爆発的になります。

+0

私はちょうど約5分前に同じ実現をしました。私はそれが正しいと信じて、この時点で私の質問は私がこれを修正するために何をすることができますか?好ましくは、私はそれを再帰的に保つだろう。 あなたがそれを避ける方法を教えていただけたら、私はあなたの答えに印をつけます。 – JacobVoller

+1

あなたが何をしようとしているのかわからないので、言いにくいです。私はあなたが 'System.Diagnostics.Process.Threads.Count'であなたのアプリで開いているスレッドの総数を取得してから停止する数を決定することができます。 – smead

関連する問題