none
abort: TOO MANY THREADS RRS feed

  • 質問

  • お世話になります。

    開発環境:VC++2003・Win32SDK

    複数のDLLがスレッドを作成するアプリを
    開発したのですが、スレッドを複数生成する際に
    「abort: TOO MANY THREADS」とコマンドプロンプト画面に
    表示され強制終了する事があります。

    「abort: TOO MANY THREADS」との内容なので
    作成するスレッドを抑制すると強制終了する事は
    無くなったのですが、詳しい理由がよく分かりません。

    もし何か情報をお持ちの方がいたら教授ください。
    よろしくお願いします。

    2009年8月7日 8:41

回答

  • 複数のDLLがスレッドを作成するアプリを
    開発したのですが、スレッドを複数生成する際に

    「abort: TOO MANY THREADS」とコマンドプロンプト画面に
    表示され強制終了する事があります。

    「abort: TOO MANY THREADS」との内容なので
    作成するスレッドを抑制すると強制終了する事は
    無くなったのですが、詳しい理由がよく分かりません。

    スレッドの数が多すぎると言うようなエラーが出ると言うのはどの位の数のスレッドを上げた時の話なんでしょう?

    システムリソースには限りがありますから、無限にスレッドが起こせるわけでは有りませんよね。
    例えば、スレッドをひとつ起こすとハンドルが割り当てられますが、このハンドル数にしても上限があります。
    私も今までスレッドを使ったプログラムを幾つか作ってきていますが、上記のようなメッセージが出た事は有りません。
    なので、ちょっとやそっとの数で出るメッセージとは思えないのです。
    ハンドルの数はシステム全体の上限が決まっているはずなのでスレッドを使用する場合にしても
    安易にスレッドの数を増やす事はするべきでは無いと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク samejip 2009年8月10日 6:08
    2009年8月7日 9:30
  • 同意見です。
    ハンドル数の上限よりもスタックメモリ不足で止まる気がします。というのも1スレッド1MB消費するため、32bitシステムなら2048スレッド作ることはできません。1000ぐらいは作れるかな。
    スタックサイズを縮小させているなら、確信犯(誤用)ですよね。

    どんな処理をしている時にどんな方針でスレッドを作成しているのかが気になります。
    それによって、thread poolを使ったり、I/O完了ポートを使ったり、と別アプローチがあります。

    また、タスクマネージャで各プロセスのスレッド数を見、どれほど特異なことをしようとしているのかを自覚された方がいいですよ。
    • 回答としてマーク samejip 2009年8月10日 6:09
    2009年8月7日 9:59

すべての返信

  • 複数のDLLがスレッドを作成するアプリを
    開発したのですが、スレッドを複数生成する際に

    「abort: TOO MANY THREADS」とコマンドプロンプト画面に
    表示され強制終了する事があります。

    「abort: TOO MANY THREADS」との内容なので
    作成するスレッドを抑制すると強制終了する事は
    無くなったのですが、詳しい理由がよく分かりません。

    スレッドの数が多すぎると言うようなエラーが出ると言うのはどの位の数のスレッドを上げた時の話なんでしょう?

    システムリソースには限りがありますから、無限にスレッドが起こせるわけでは有りませんよね。
    例えば、スレッドをひとつ起こすとハンドルが割り当てられますが、このハンドル数にしても上限があります。
    私も今までスレッドを使ったプログラムを幾つか作ってきていますが、上記のようなメッセージが出た事は有りません。
    なので、ちょっとやそっとの数で出るメッセージとは思えないのです。
    ハンドルの数はシステム全体の上限が決まっているはずなのでスレッドを使用する場合にしても
    安易にスレッドの数を増やす事はするべきでは無いと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク samejip 2009年8月10日 6:08
    2009年8月7日 9:30
  • 同意見です。
    ハンドル数の上限よりもスタックメモリ不足で止まる気がします。というのも1スレッド1MB消費するため、32bitシステムなら2048スレッド作ることはできません。1000ぐらいは作れるかな。
    スタックサイズを縮小させているなら、確信犯(誤用)ですよね。

    どんな処理をしている時にどんな方針でスレッドを作成しているのかが気になります。
    それによって、thread poolを使ったり、I/O完了ポートを使ったり、と別アプローチがあります。

    また、タスクマネージャで各プロセスのスレッド数を見、どれほど特異なことをしようとしているのかを自覚された方がいいですよ。
    • 回答としてマーク samejip 2009年8月10日 6:09
    2009年8月7日 9:59