• ベストアンサー

無限ループ対策

プログラミングのデバッグ時、無限ループに入ってしまい、プログラムを強制終了することもままならなくなることがあります。 CPUのリソースを完全に使っているために、こちらの入力を受け付けなくなると思うのですが、 マルチCPU環境ではどういった状態になるのでしょうか? 無限ループは起こらないのでしょうか? さらに、デュアルコアCPUの場合はどうなのでしょうか? 無限ループのもどかしさから開放されるならPCを新調しようと思うのですが、 何かご存知の方教えてください。よろしくお願いします。

noname#15404
noname#15404

質問者が選んだベストアンサー

  • ベストアンサー
noname#15164
noname#15164
回答No.2

前にも書かれていますか? その時は、Apacheだったとか。 私も興味をもち、Apacheのtimeoutの設定をして、無限ループをしたのですが、見事にフリーズ。(w 回答するのが面倒になり、回答しなかったのを覚えています。 w2k環境でUsers権限でapacheをPower権限で動かしていたので、プロセスを殺す事もできませんでした。;; フリーズですが、片方がフリーズしてももう片方が動くので、どうやらシステムが止まる事はないようです。 でも、無限ループの場合はCPUが100%になるので、あんまり良くはないとは思いますが。 実際に使った事はないので、わかりません。 無限ループですが、無限ループをさせない工夫の方が大切だと思いますよ。 私は、変数がなくなるまでループするような時でも、上限を決めています。 1000回実行したら、breakするとか。 Perl、PHPなら、$i++ とif文だけで片づきますし。 一応、入力時の変数のチェックもしていますが、文字コードや相手の環境、システムのバグなんかもありますし。 最悪サーバでの無限ループは避けたいと思っているのでの、ダブルチェック、トリプルチェックはしているつもりです。 ローカル環境でも強制終了は、HDDにも危険ですからねー。

その他の回答 (3)

回答No.4

>マルチCPU環境ではどういった状態になるのでしょうか? マルチCPUのマシンでは、シングルスレッドのプログラムは、 一つのCPUしか使わないので、CPU全体の50%を 占有した状態になります。 >無限ループは起こらないのでしょうか? 無限ループ自体は、環境でなく、プログラムを作る人の 善し悪しが招く問題です。 如何なる環境であろうと無限ループは起こりえます。 起こった場合の被害の大小が環境によって違う。 起こった場合に被害を最小限に納める仕組みがある。 などの違いはあると思いますが.. >無限ループのもどかしさから開放されるならPCを新調しようと思うのですが、 PCを変えても、無限ループ自体は、制作物の品質が悪ければ起こるわけで、 結局は、デバックする必要があるのだから、環境のせいにするより 自分の力を磨く方が良いかと思いますよ。

  • coredump
  • ベストアンサー率46% (12/26)
回答No.3

どもです。 通常は無限ループにならないようにするのが基本です。 無限ループでポーリングしなければならないなどの状況も考えられるのですが、このような場合にはループの中にsleepを入れてあげればCPUの使用率を抑えることが出来ます。Winならループ内にSleep(1);を入れてあげるだけで、ハングしたような状況は防げます。

  • 0KG00
  • ベストアンサー率36% (334/913)
回答No.1

無限ループというよりは、タスク(プロセス)がCPUをつかんで離すかどうかの問題ですよね。 CPUが何れであれ、免れないですね。 どちらかというと、NT系などのプリエンプティブなマルチタスクOSだと免れやすいかもしれませんが、保存をしないまま実行すると危険なことは変わりありません。 CPU新調よりはOSの変更のほうが効果がありますよ。

noname#15404
質問者

お礼

とりあえずWindowsXPを使っているのですが、無限LOOPになると タスクマネージャーを開くにも相当時間がかかります。 これはもうガマンするしかないのでしょうかね。

関連するQ&A

  • 無限ループでDebug.Writelineしてしまい、VB2005が応用しません(>_<)

    VB2005 ExpressEditionです。 先ほど、間違えて無限ループ内でDebug.Writelineメソッドを使ってしまい、プログラムのデバッグ中止ボタンを押せたにも関わらず、いつまでもイミディエイトウィンドウに文字列がトレースされます。かれこれ30分ぐらい経ってもまだ終わらず、ビジー状態で次の作業に移れません。 プログラムを強制終了するしかないでしょうか? 保存していない変更が破棄されると困るのですが、強制終了しても作業時の状態をを復元する機能などあるでしょうか?

  • 無限ループで暴走

    自分の力量が足らずしょっちゅうcgiで誤って無限ループを作成し自分のPCの仮想サーバでテスト実行してしまいます 案の定、暴走・・・ Apachi2を終了してもperl.exeが処理を続けていてCPU使用率が100%のままでタスクマネージャーでperl.exeを強制終了しようとしてもアクセス拒否されてしまいます 仕方が無くいつもPCを再起動しいます PCを再起動せずにCPU使用率を下げる方法はありますでしょうか?

    • 締切済み
    • CGI
  • VB上で実行中の無限ループの止め方

    今まで、CUIベースのBASICでのプログラムの経験はあるのですが Visual系のBASICは初心者です。 原因はわかっているのでプログラムの修正はできるのですが VB上でコンパイルして実行したときに無限ループに陥ってしまって どうにもプログラムをとめられなくなります。 そんなことがないように、実行前に全てのプロジェクトを保存して いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・ 今現在は、タスクマネージャーから強制終了させています。

  • visual C++ 2008での無限ループの対応

    最近C言語でのプログラミングを始めたのですが、visual C++ 2008で実行をしたときプログラムが無限ループになっていた場合どすれば元にもどるのでしょうか?ご存知の方がおられましたら対処方法を教えてください。お願い致します。

  • VBScriptの無限ループ動作で簡単終了方法

    お世話になります。 私のPCでは、監視のために無限ループ動作のVBScriptが三つほど動いています。それでメンテナンスでどれかの一つを停止(強制終了)しようと、タスクマネージャーにアクセスしてもイメージ名が皆同じで、区別がつかず困るときがあります。 そこで、最初からこの無限ループ動作のスクリプトに仕込みをしておいて、いつでも簡単に終了させる方法などありますか。検索してもまったく見つかりませんでしたので、相談させて頂きました。

  • 無限ループ中にある任意のキーを押すと抜けるコードを作りたいのですが・・・(VB6です)

    無限ループを動作中にあるキー(例えば[Ctrl]+[c])を押すと、そのプログラムを抜けて終了するコードを作りたいのですが、どなたかご教授いただけませんでしょうか?

  • Win98 + Excel97 + VB での無限ループの強制終了

    表題の件なのですが、 例えばエクセルシートの適当な位置にボタンを配し、以下のようなソースを組んだとします。 Private Sub CommandButton1_Click() s=0 Do While (s<15) s = s + 1 Loop End Sub もしも誤って s=s+1の行をコメントにしたら無限ループとなり エクセル及びVBが【実行中】のまま固まってしまいますよね? この場合「タスクマネージャ」を使って強制終了しています。 当然エクセルもVBもタスクから消滅してしまいます。 ファイルを保存していない時にこの状態になるとかなりブルーです。 作成途中のプログラムを残せるようなプログラムのみ終了させる方法 または 無限ループ内に「ループから強制的に抜け出すようなアクション」の埋め込み方法(または以下の意味は解りますかね…(汗)) 等、ありましたら回答よろしくお願いします。 それともこのような状態になったら「ソースを作ったあなたが悪い!最終保存以降の編集内容はあきらめよ」と言うことなんでしょうか? ちなみに論点はForNext等への変更ではなく あくまで「誤って表記してしまった無限ループからの脱出」です よろしくお願いします。

  • ループを途中で抜けたいのですが。

    無限ループさせているwhileやfor文などで、 何かのキーを押すとループを抜けるように設定したいのですが可能でしょうか? (scanfやcinなどをループの中に組み込まずに。ctrl+Cも無しで。) (あと、フォーム上ではなくコンソール上で。) 多分説明不足なのでもうちょっと詳しく。 たとえば、 while ( i != 1 ){ j += 1; } の様な無限ループを設定したとして、 本来なら if (j > 100 ){ break; } とか、 while文の中に scanf ( "%d" , &i ); 等を入れて終了条件を満たさせるべきですが、 そうではなく、ひたすら無限ループを続けているところにEscキーを押すとループから脱出するようなプログラムを作ってみたいのです。 そういうプログラムは可能でしょうか? どうかご教授下さい。 使用コンパイラ:Visual C++ 2008 Express Edition

  • 無限ループからの脱出

    import java.io.*; public class Test { public static void main(String[] args) throws IOException { String ss; int idt; while(true) { try { BufferedReader f = new BufferedReader(new InputStreamReader(System.in)); System.out.print("数字を入力してください : "); ss = f.readLine(); if(ss == "end") break; idt = Integer.parseInt(ss); System.out.println("あなたの入力した数字は " + idt + " です。"); System.out.println(); } catch(NumberFormatException e) { System.out.println("error : " + e); System.out.println(); } } } } 上記は、コンソールに入力した数字をそのまま出力し、数字以外を入力すると例外処理するプログラムです。 見ていただくと分かるとおり、途中入力したものが「end」だとbreakして無限ループを脱出するということを予定して作りました。 しかしbreakしてくれません。if文の中に処理が移っていないのです。なぜでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • 無限ループからの脱出用の文について

    **************************************************************** Button2がクリックされたらButton1の中のwhileの無限ループから抜け出すようにしたいのですが、どのようにすればよいのでしょうか。プログラミング初心者な為、初歩的な質問で申し訳ありません。 **************************************************************** Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click   質問1:Button2がクリックされた時のプログラム End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click While True   If 質問2:(Button2がクリックされたとき)Then Exit While End While End Sub

専門家に質問してみよう