C で sleep() の代替手段はありますか?

あなたが説明する種類のループは、「ビジー待機」と呼ばれます。実際のオペレーティング システムでは、スリープしてもビジー待機は発生しません。スリープ期間が終了するまでプロセスをスケジュールしないようにオペレーティング システムに指示します。


一般的なメカニズムの 1 つは、select() を使用することです。 タイムアウトが保証され、タイムアウトとしてスリープ時間を指定します:

// Sleep for 1.5 sec
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
select(0, NULL, NULL, NULL, &tv);

select() 通常、一連のファイル記述子をチェックし、少なくとも 1 つが I/O を実行する準備ができるまで待機するために使用されます。準備ができていない場合 (または、この場合、fds が指定されていない場合)、タイムアウトになります。

select() の利点 ビジー ループでは、スリープ中にリソースをほとんど消費しないのに対し、ビジー ループでは優先レベルで許可されている限りプロセッサを独占します。


代替手段は、何をしようとしているのか、どの OS を使用しているかによって異なります。

時間を無駄にしたいだけなら、以下が役に立ちます:

ほとんどの UNIX タイプのシステムでは、'usleep' 関数を見つけることができます。これは多かれ少なかれ、より高い解像度のスリープに似ています。通常は 1 マイクロ秒しかスリープできないため、注意してください。

一部の UNIX タイプのシステムでは、select システム コールをすべてのファイル記述子セット 0 で使用して、かなり正確な 1 秒未満の待機を得ることができます。

Windows システムでは、Sleep があります。これはほとんど同じですが、数ミリ秒かかります。

マルチタスク オペレーティング システムでは、スリープ関数にパラメータとして 0 を指定できる場合があります。これにより、通常、関数はそのタイムスライスを放棄しますが、他のタスクを実行する準備ができていない場合はすぐに再スケジュールされます。