none
スレッドの作成数 RRS feed

  • 質問

  • ◆ Visual Studio 2013 Professional
    ◆ PC Spec
            OS : windows7 home premium   32bit
      プロセッサ:Intel(R) Pentium(R) CPU G3250 @ 3.2GHz
        実装メモリ: 4GB  

    上記、環境のPCにて、Formアプリケーションを作成しているのですが、
    スレッド数を5個くらい作成すると、スレッドでの処理をするときとしないときがあるのですが・・・
    作成できるスレッド数って決まっているのでしょうか?

    スレッドはバックグラウンドワーカーを利用しております。

    2016年9月27日 3:45

回答

  • ◆ 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待ちの空きができるため、順次スレッドが追加作成されていったりします。

    • 編集済み なちゃ 2016年9月27日 4:18
    • 回答としてマーク kakuwane 2016年9月27日 5:28
    2016年9月27日 4:16

すべての返信

  • ◆ 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待ちの空きができるため、順次スレッドが追加作成されていったりします。

    • 編集済み なちゃ 2016年9月27日 4:18
    • 回答としてマーク kakuwane 2016年9月27日 5:28
    2016年9月27日 4:16
  • 5個程度であれば問題なく作ることができ、動作します。「スレッドでの処理をするときとしないときがある」とのことですが、書かれた処理に問題があると思われます。

    ちなみにスレッド毎にスタックが存在し、そのデフォルトサイズが1MBとなっています。そのため、32bitアプリケーションで2000スレッド作成すると2GB消費する計算になり、メモリ不足が発生します。そのくらいの数のスレッドは作成できるということで。

    2016年9月27日 4:22
  • タスクマネージャーのパフォーマンスを確認すると2つあります。
    スレッド数は2つまでということでしょうか?

    他のスレッド

    タイマー処理を組み合わせるとうまくいきますでしょうか?

    2016年9月27日 4:29
  • スレッド内に処理したい順番で
    if文とswitch文で記載していて、ビルドエラーはないです。

    Integer.ParseとSystem.Text.Encoding.ASCII.GetString(data)の値が
    変換するときとしないときがあり・・・
    変換も値が化けるときもあります。

    • 編集済み kakuwane 2016年9月27日 4:46 詳細記載
    2016年9月27日 4:32
  • 「困ってます」と書かれましても、「困ってください」としか答えようがありません。何の目的でこのフォーラムに書き込まれているのでしょうか?
    2016年9月27日 4:34
  • スレッドの数により、処理、非処理があるのか知りたいためです。
    2016年9月27日 4:48
  • 非処理というのがどういうのを想定しているか分かりませんが、スレッドプールでは

    • 最低限の数のスレッドは常にプールされている。ジョブが投入された場合、このプールに余っているスレッドがあるなら、そのスレッドに直ちに投入する。
    • プールのスレッドが尽きた場合、投入されたジョブは短時間待機させられる。待機中に他で使っていたスレッドが処理完了でプールに帰ってきた場合、そのスレッドにジョブを処理させる。
    • スレッドが埋まったままの場合、(スレッド数が上限に達していなければ)新たにスレッドを作成し、そのスレッドにジョブを処理させる。

    といった動作になります。少なくとも「処理されないままキャンセルされる」ということが勝手に行われることはありません。

    スレッド数の上下限等の具体的な値は実行環境によって異なります。ThreadPoolクラスに実際の値を取得するいくつかのプロパティが用意されています。

    • 回答としてマーク kakuwane 2016年9月27日 5:28
    • 回答としてマークされていない kakuwane 2016年9月27日 5:29
    2016年9月27日 4:57