私は毎回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?だから、私は次の質問を思います、スレッド制限を超えないでこの操作を再帰的に行う方法はありますか?
コードをコピーしてVSまたはLINQPadにコピーして実行できるようにしてください。今はエラーがいっぱいです。あなたは本当に[mcve]を投稿する必要があります。そうでなければ、この質問は答えられません。 – Enigmativity
@Enigmativityメソッド署名を 'v'に固定し、intのデフォルト値を追加しました。私はそれが今コンパイルされるべきだと考えていますが、それはこの時点で、そして実装の問題の理論的な問題です。 – JacobVoller
コードはまだコンパイルされませんが、コンパイルするにはあまり時間がかかりませんでした。あなたがここに質問を書くとき、私たちがそれに答えるのを助けるためにできるだけ多くの仕事をするべきです。いずれにしても、私が実行したときに例外が発生しました。 "タイプ 'System.OutOfMemoryException'の例外がスローされました。"すべてのスレッドのためにRAMを使い果たした無限に再帰的なメソッドを作成しました。このコードは、 'int'の配列がスレッドセーフであるかどうかには関係ありません。あなたはそれがそうするように修正できますか? – Enigmativity