マルチスレッド計算を実行しようとしていますが、各スレッドを個別に管理するのに問題があります。
たとえば、あるスレッドが他のスレッドよりも速く計算を終了した場合、プロセス全体と他のすべてのスレッドが独自のタスクを完了するのを待たずに、それを検出して次の計算のために新しいスレッドを開始するにはどうすればよいでしょうか?
ところで、私はC#.net 4.5を使用しています。
ありがとう
マルチスレッド計算を実行しようとしていますが、各スレッドを個別に管理するのに問題があります。
たとえば、あるスレッドが他のスレッドよりも速く計算を終了した場合、プロセス全体と他のすべてのスレッドが独自のタスクを完了するのを待たずに、それを検出して次の計算のために新しいスレッドを開始するにはどうすればよいでしょうか?
ところで、私はC#.net 4.5を使用しています。
ありがとう
計算ごとにTPLタスクを作成し、それらを開始します。内部的に各タスクはキューに入れられ、スレッドが利用可能になると実行されます。したがって、スレッド管理について気にする必要はなく、内部で処理されます。
一度に実行する並列タスクの最大数を制限したい場合は、 Parallel.Invoke メソッドを使用して MaxDegreeOfParallelism を設定できます。
Parallel.Invoke(
new ParallelOptions() { MaxDegreeOfParallelism = 3 },
() => Calculation1(),
() => Calculation2(),
() => Calculation3(),
);
Parallel.Invoke はパラメーターの配列を取り、それに対してアクションを実行してそれらをすべて並行して実行します。同時に MaxDegreeOfParallelism を設定して、一度に実行する計算の最大数を設定できます。
例えば
入力として同じメソッド (Calculate) が複数のパラメーター (Parameters) を持っていると思います。
Parallel.ForEach(Parameters,new ParallelOptions() { MaxDegreeOfParallelism = 3 }, parameter=> Calculate(parameter));