3

私はparallel.forセットアップを使用しています:

Parallel.For(0, 4, new ParallelOptions { MaxDegreeOfParallelism = 4 }, j =>

4 つのワーカー スレッドが作成されることを期待していますが、コンカレンシー ビジュアライザーには、使用されているワーカー スレッドが 3 つしか表示されません。私は最大の並列度とプロセッサ アフィニティを使用しようとしましたが、各シナリオでは 4 ではなく 3 つのワーカー スレッドのみが使用されます。なぜこれが起こっているのか明確な答えはありますか? 乾杯

4

4 に答える 4

1

そのMaxDegreeOfParallelism通りなので、それ以上にはなりませんが、必要以上に使うこともありません。

これは、 MSDNで次のように述べられています。

デフォルトでは、For と ForEach は基礎となるスケジューラーが提供する多くのスレッドを利用するため、MaxDegreeOfParallelism をデフォルトから変更しても、使用される同時タスクの数が制限されるだけです。

于 2013-11-09T17:32:03.027 に答える
0

前述のとおり、実際のスレッド数ではなく、最大数のみを指定できます。使用可能なコアが 4 つあり、ワークロードが自明でない場合、開始元のスレッドがワークアイテムの実行にも使用されるため、4 つすべてが並行して実行されますFor

さらに、Parallel.For入力範囲をチャンクする場合があります。4件分は無理かもしれませんが、気になる方は で4件まとめて予約できますParallel.Invoke()

于 2013-11-09T18:27:04.110 に答える
0

Parallel.For は、ユーザーがどれだけ刺激を与えるかわかりません。柔軟性があり、スレッド キューを処理し、実行時に、使用可能なコアが threadque から特定のワーク スレッドを受信して​​いるかどうかを判断します。コアは、Windows マシンで実行されているコードだけではないため、利用できない場合があります。または、コアに与えた以前のワークロードでまだビジー状態である可能性があります。

ここでより詳細な情報http://reedcopsey.com/2010/01/26/parallelism-in-net-part-5-partitioning-of-work/

于 2016-03-30T15:26:32.120 に答える
0

これは設計によるもので、どこで読んだか覚えていませんが、下にあるスレッドプールを使用し、プロセッサの能力があるため、タスクを実行するだけです。C# と F# に違いがあるのは奇妙に聞こえますが。

理論的には、利用可能なプロセッサ コアにも依存するはずです。コアが 1 つしかない場合は、複数のスレッドを起動する必要はありません。

強制的に 4 を使用したい場合は、独自のスケジューラを作成できます。

于 2013-11-09T17:55:36.827 に答える