1

以下のコードを使用して、プロセス内のスレッドの総数を示す簡単な実験を行いました。

Console.WriteLine("Total Number of Threads: {0}", Process.GetCurrentProcess().Threads.Count);

Parallel.ForEach(
            names,
            new ParallelOptions  {MaxDegreeOfParallelism = Environment.ProcessorCount },
            name =>
            {
                Console.WriteLine(name);
            });
Console.Read();
Console.WriteLine("Total Number of Threads: {0}", Process.GetCurrentProcess().Threads.Count);

parallel.foreachの前に12スレッドを取得し、parallel.foreachの後に17スレッドを取得しました。

質問:

  1. Parallel.Foreachで使用される5つのスレッドがループ後も実行され続けるのはなぜですか?他のParallel.Foreachがある場合、この後、さらに多くのスレッドが増加し続けることを意味しますか?
  2. Parallel.Foreachが以前に12スレッドを使用しなかったのはなぜですか?12スレッドが現在他の人によって使用されているからですか?
4

2 に答える 2

7

この動作は、外部から見ると決定論的ではありません。

Parallelクラスはスレッドプールを使用します。新しいスレッドをいつ作成するか、古いスレッドをいつ使用するかについては、いくつかの決定があります。これはまたあなたにパフォーマンスを与え、必要な記憶の量を減らします。

そのため、並列foreachの後、いくつかのスレッドが(一時的に)まだ存在している可能性があり、スレッドプールアクティビティに使用できます。しかし、私が知る限り、スレッドが存在し続けるかどうか、またはいくつ存在し続けるかを予測することはできません。

于 2013-02-14T07:23:36.750 に答える
-2

私の理解では、実行されるスレッドの数を予測することはできません。AutoResetEventを使用して処理したスレッド数が希望よりも多いという問題が発生しました。

于 2021-09-10T19:09:51.320 に答える