私はコードの一部でSleep(0)
を使用していて、無限/長いwhile
ループが使用可能でした。タイムスライスを他の待機中のプロセスで使用できるようになると通知されました。これは本当ですか? Sleep(0)
に意味はありますか?
MSDNのドキュメントによると Sleep :
値を0にすると、スレッドは残りのタイムスライスを、実行の準備ができている他のスレッドに放棄します。実行する準備ができている他のスレッドがない場合、関数はすぐに戻り、スレッドは実行を継続します。
認識すべき重要なことは、はい、これにより他のスレッドに実行の機会が与えられますが、実行する準備ができていない場合、スレッドは続行します-CPU使用率は100%のままです何かは常に実行されます。 whileループが何らかの条件を待っている間だけ回転している場合は、イベントのような同期プリミティブを使用して、条件が満たされるまでスリープするか、CPUが最大になるのを防ぐために少しの間スリープすることを検討してください。
はい、他のスレッドに実行の機会を与えます。
値を0にすると、スレッドは残りのタイムスライスを、実行の準備ができている他のスレッドに放棄します。実行する準備ができている他のスレッドがない場合、関数はすぐに戻り、スレッドは実行を継続します。
私は MSDN docs を改善できないと思います
値を0にすると、スレッドは残りのタイムスライスを、実行の準備ができている他のスレッドに放棄します。実行する準備ができている他のスレッドがない場合、関数はすぐに戻り、スレッドは実行を継続します。
Windows XP/2000:値がゼロの場合、スレッドはタイムスライスの残りの部分を、実行の準備ができている同じ優先度の他のスレッドに放棄します。同じ優先度で実行の準備ができている他のスレッドがない場合、関数はすぐに戻り、スレッドは実行を継続します。この動作は、Windows Server 2003以降で変更されました。
また、効率の問題に関する2つの有用な回答を(賛成票で)ここに記入してください。
Sleep(0)に注意してください。1つのループ反復実行時間が短い場合、そのようなループが大幅に遅くなる可能性があります。これを使用することが重要である場合、たとえば、100回の反復ごとに1回、Sleep(0)を呼び出すことができます。
Sleep(0);
その命令で、システムスケジューラは他の実行可能なスレッドをチェックし、スレッドの優先順位に応じてシステムリソースを使用する機会を与えます。
Linuxでは、このための特定のコマンドがあります:マニュアルページのsched_yield()
:
sched_yield()
は、呼び出しスレッドがCPUを放棄するようにします。スレッドは静的優先順位のためにキューの最後に移動され、新しいスレッドが実行されます。呼び出し元のスレッドがその時点で最も優先度の高いリストにある唯一のスレッドである場合、
sched_yield()
の呼び出し後も引き続き実行されます。
とも
sched_yield()
への戦略的な呼び出しは、呼び出し元によって(非常に)競合するリソース(ミューテックスなど)が解放されたときに他のスレッドまたはプロセスに実行の機会を与えることにより、パフォーマンスを向上させることができます。sched_yield()
を不必要または不適切に呼び出すことは避けてください(他のスケジュール可能なスレッドが必要とするリソースがまだ呼び出し元によって保持されている場合など)。これにより、不要なコンテキスト切り替えが発生し、システムのパフォーマンスが低下します。
1つのアプリで、メインスレッドがやるべきことを探し、新しいスレッドを介して「作業」を開始しました。この場合、メインスレッドでsched_yield()(またはsleep(0))を呼び出す必要があります。これにより、作業の「見栄え」が失われ、「作業」よりも重要になります。私はsleep(0)を好みますが、これは過剰な場合があります(ほんの一瞬で眠っているからです)。
Sleep(0)は強力なツールであり、特定の場合にパフォーマンスを向上させることができます。特殊なケースでは、高速ループでの使用が検討される場合があります。一連のスレッドが最大の応答性を必要とする場合、それらはすべてSleep(0)を頻繁に使用します。しかし、コードのコンテキストでレスポンシブが何を意味するのかについての定規を見つけることは重要です。
https://stackoverflow.com/a/11456112/150452 でいくつかの詳細を示しました
私はpthreadを使用していますが、私のMacで何らかの理由により、コンパイラーはpthread_yield()が宣言されていることを検出しません。しかし、sleep(0)は同じもののようです。