予想以上にスリープしている Sleep() の調査
Windows API の Sleep() 関数は、スレッドの実行を一時停止するための多用途ツールです。ただし、一部のユーザーは、関数が意図したよりも長くスリープするという予期しない動作に遭遇します。この記事では、この問題を詳しく掘り下げ、一般的に発生する問題と潜在的な原因を調べます。
動作と継続時間の差異
ループ内で Sleep(1) を 100 回呼び出すと、合計スリープ時間は 100 ミリ秒ではなく 1500 ミリ秒であることが観察されます。この差異は、実際のスリープ期間が反復ごとに約 15 ミリ秒であることを示唆しています。この動作はシステムによって異なり、一部のユーザーは一貫した 1 ミリ秒のスリープ期間を報告していることに注意してください。
考えられる理由
過度のスリープ期間は、必ずしもハードウェアまたはソフトウェアの誤動作を示しているとは限りません。 。 Windows スレッドのスケジューリングでは、スレッドの実行が拘束される時間間隔である「タイム クォンタム」を採用しています。ゼロ以外のスリープ期間の場合、実際の遅延は最も近い完全なクォンタムに切り上げられます。
デフォルトのタイム クォンタム
デフォルトでは、Windows 7 のタイム クォンタムは次のとおりです。 15.6ミリ秒。これは、Sleep(1) が実際にスレッドを最小 15.6 ミリ秒間一時停止することを意味し、その結果、反復ごとに 15 ミリ秒のスリープ動作が観察されることになります。
代替説明
場合によっては、観測された 1ms のスリープ期間は、システム全体のタイマー解像度を 1ms に変更した別のプログラムまたはプロセスの存在に起因する可能性があります。このオーバーライドにより、スリープ期間がより正確になる可能性があります。
結論
このシナリオにおける Sleep() 関数の動作は、通常は予期されたものです。 Windows のスレッド スケジューラのタイム クォンタム メカニズムは、スリープ期間を完了間隔に切り上げるため、短い期間ではスリープ時間が長くなります。ただし、タイマー解像度設定の変更などの外部要因も睡眠動作に影響を与える可能性があります。
以上がWindows の Sleep(1) が予想よりも長くスリープすることがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。