トップ回答者
スレッドの作成数

質問
-
回答
-
◆ Visual Studio 2013 Professional
◆ PC Spec
OS : windows7 home premium 32bit
プロセッサ:Intel(R) Pentium(R) CPU G3250 @ 3.2GHz
実装メモリ: 4GB上記、環境のPCにて、Formアプリケーションを作成しているのですが、
スレッド数を5個くらい作成すると、スレッドでの処理をするときとしないときがあるのですが・・・
作成できるスレッド数って決まっているのでしょうか?スレッドはバックグラウンドワーカーを利用しております。
バックグラウンドワーカーは、スレッドを作成するのではなく、スレッドプールにジョブを投入するイメージで動作します。
通常、CPUバウンドの処理では、CPUコア数のスレッドがまず準備されるのが一般的な動作ですので、それ以上のジョブは待たされる可能性が高いです。(それ以上スレッドを準備しても、CPUコアに空きがないので待たされるだけになるため)。
※この、まずコア数分のスレッド準備というのも、実際に開始されるまでは待機が入ったりしますので、すぐに開始されるとは限りません。
--追記
これがファイルやネットワーク読み書きなどのIOバウンドの処理になると、CPUコアにIO待ちの空きができるため、順次スレッドが追加作成されていったりします。
すべての返信
-
◆ Visual Studio 2013 Professional
◆ PC Spec
OS : windows7 home premium 32bit
プロセッサ:Intel(R) Pentium(R) CPU G3250 @ 3.2GHz
実装メモリ: 4GB上記、環境のPCにて、Formアプリケーションを作成しているのですが、
スレッド数を5個くらい作成すると、スレッドでの処理をするときとしないときがあるのですが・・・
作成できるスレッド数って決まっているのでしょうか?スレッドはバックグラウンドワーカーを利用しております。
バックグラウンドワーカーは、スレッドを作成するのではなく、スレッドプールにジョブを投入するイメージで動作します。
通常、CPUバウンドの処理では、CPUコア数のスレッドがまず準備されるのが一般的な動作ですので、それ以上のジョブは待たされる可能性が高いです。(それ以上スレッドを準備しても、CPUコアに空きがないので待たされるだけになるため)。
※この、まずコア数分のスレッド準備というのも、実際に開始されるまでは待機が入ったりしますので、すぐに開始されるとは限りません。
--追記
これがファイルやネットワーク読み書きなどのIOバウンドの処理になると、CPUコアにIO待ちの空きができるため、順次スレッドが追加作成されていったりします。
-
非処理というのがどういうのを想定しているか分かりませんが、スレッドプールでは
- 最低限の数のスレッドは常にプールされている。ジョブが投入された場合、このプールに余っているスレッドがあるなら、そのスレッドに直ちに投入する。
- プールのスレッドが尽きた場合、投入されたジョブは短時間待機させられる。待機中に他で使っていたスレッドが処理完了でプールに帰ってきた場合、そのスレッドにジョブを処理させる。
- スレッドが埋まったままの場合、(スレッド数が上限に達していなければ)新たにスレッドを作成し、そのスレッドにジョブを処理させる。
といった動作になります。少なくとも「処理されないままキャンセルされる」ということが勝手に行われることはありません。
スレッド数の上下限等の具体的な値は実行環境によって異なります。ThreadPoolクラスに実際の値を取得するいくつかのプロパティが用意されています。