2

無限ループは悪として教えられています。良い使用法はありますか?

それらを誤ってコーディングすると、特にループ内で変数を割り当てる場合に、CPU がピークに達し、メモリもピークに達すると思います。

有効な用途がある場合、それらの問題はどのように防止されますか?

4

3 に答える 3

6

基本的に、すべてのオペレーティング システムまたはサーバーは無限ループでスピンします。

通常、これらのメモリの問題を回避するには、後で同じループ内でメモリを解放できない限り、ループ内でメモリを割り当てません。たとえば、リクエストにメモリを割り当て、サービスが提供されたら削除します。

CPU のピークを回避するには、os の場合は割り込みを待機するか、反復ごとに 1 回新しいイベントを待機する poll() などのブロッキング関数を呼び出します。

于 2013-08-19T12:09:24.717 に答える
4

まず、このフレーズの「無限」という言葉は、もう少し大まかに捉えるべきです。時間とすべての人類の終わりまで実行されるループとは対照的に、最終的に終了する命令のあるwhile (true)ループについて話していると思います。break

前者の意味では、はい、それ適切なユースケースがあります:

不適切に使用される可能性のある例の 1 つは、CPU を回転させて時間遅延を作成するために使用される場合です。これは、初心者のプログラマーがタイマー割り込み (またはタイマー イベント、またはその他の非手続き型構造) の処理を​​避けるために行う傾向があることです。ただし、共有リソースを取得するために CPU の回転が行われる場合、「無限ループ」も完全に有効な実装の選択肢です。たとえば、.NET CLR モニターでさえ、カーネル イベント ハンドルで真の待機を発行し、より高価なスレッド スイッチを作成する前に、数百サイクルのスピンを試行します。

于 2013-08-19T14:25:30.497 に答える
2

イベント ループで実行されるプログラム (@Christoph が言及するシステム プロセスなど) に加えて、一部の言語にはgeneratorと呼ばれる概念があり、無限ループを作成することを許可し、それを奨励することさえあります。秘訣は、オブジェクトが何らかの式を「生成」(返す) するときに、オブジェクトが有限時間だけ実行されることです。その後、その状態は再び必要になるまで「凍結」されます。たとえば、Python では、 と を交互に繰り返すオブジェクトを作成できLEFTますRIGHT

def side():
    while True:
        yield "LEFT"
        yield "RIGHT"

a = side()
print a.next()
print a.next()
print a.next()

与えるだろうLEFT RIGHT LEFT。このside関数は、ステートメントで無限ループのように見えますが、While True:呼び出しごとに有限の時間だけ実行されます。

于 2013-08-19T13:41:21.747 に答える