予想以上の Sleep() Sleeping の調査
Windows API の Sleep() 関数は、スレッドの実行を一時停止するための多用途ツールです。ただし、一部のユーザーは、関数が意図したよりも長くスリープするという予期しない動作に遭遇します。この記事では、この問題を詳しく掘り下げ、一般的に発生する問題と潜在的な原因を調査します。
動作と継続時間の差異
ループ内で Sleep(1) を 100 回呼び出すと、合計スリープ時間は 100 ミリ秒ではなく 1500 ミリ秒であることが観察されます。この差異は、実際のスリープ期間が反復ごとに約 15 ミリ秒であることを示唆しています。この動作はシステムによって異なり、一部のユーザーは一貫した 1ms のスリープ期間を報告していることに注意してください。
考えられる理由
過剰なスリープ期間は、必ずしもハードウェアまたはソフトウェアの誤動作を示しているわけではありません。 。 Windows スレッドのスケジューリングでは、スレッドの実行が拘束される時間間隔である「タイム クォンタム」を採用しています。ゼロ以外のスリープ期間の場合、実際の遅延は最も近い完全なクォンタムに切り上げられます。
デフォルトのタイム クォンタム
デフォルトでは、Windows 7 のタイム クォンタムは次のとおりです。 15.6ミリ秒。これは、Sleep(1) が実際には少なくとも 15.6 ミリ秒スレッドを一時停止し、その結果、反復ごとに 15 ミリ秒のスリープ動作が観察されることを意味します。
別の説明
場合によっては、観測された 1ms のスリープ期間は、システム全体のタイマー解像度を 1ms に変更した別のプログラムまたはプロセスの存在に起因する可能性があります。このオーバーライドにより、スリープ期間がより正確になる可能性があります。
結論
このシナリオにおける Sleep() 関数の動作は、通常は予期されたものです。 Windows のスレッド スケジューラのタイム クォンタム メカニズムは、スリープ期間を完了間隔に切り上げるため、短い期間ではスリープ時間が長くなります。ただし、タイマー解像度設定の変更などの外部要因も睡眠動作に影響を与える可能性があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3