2012-01-23 13 views
1

私はどのくらい正確に眠ることができるかを測定したいと思います。 私のプログラムに書いているのですか? usleep(5000) 睡眠の最大時間は何ですか?あなたはRTOSカーネルを持っている場合を除き、事前不正確なcppのusleep関数はどのようになりますか?

+0

システムの時間解像度によって異なります。 –

+0

そして私は、システムの時間分解能が、jiffieの時間量であると仮定します。もしそうなら、私のプラットフォームでは1ミリ秒、私は500マイクロ秒で私はusleep()、それは私が少なくとも1ミリ秒のために遅延されますか? – John

答えて

3

おかげで、最大時間は永遠です。信号がキャッチされない限り、

usleep(またはnanosleepまたはものは何でも睡眠)は、少なくとも限り、あなたはそれを伝えるとを待つように保証し、システムタイマーの粒度、に丸め。戻り値からシグナルが発生したかどうかを知ることができます。

この時間が経過すると、スレッドは実行準備が整い、最終的にスケジューラの裁量で実行されます。あなたが知らない千の要因にもよるが、これは次のナノ秒でも5分でも、決してそうでないかもしれない。

+0

技術的には間違いありませんが、これは役に立たない答えです。 99.9%の人々が理論的な限界ではなく、99.9%のケースを気にしています。 – minexew

+0

@minexew:99.9%の人々は、ほとんど常に間違っているので、どのプログラムでもsleepを使用しません。 OPは、明らかに0.01%の人の1人だけでなく、最悪のケースを気にする人の0.01%の1人です(したがって、質問です!)。また、下限(「アンダーライン」)も同様に重要であり、それを意識するよりも多くの人々に影響を与えることに注意してください。誰も戻り値をチェックすることはほとんどありません(同じことが、例えば、closeの戻り値についても同様です。同様に面倒です)。 – Damon

2

usleepは、最新のLinuxシステムではnanosleepシステムコールを使用するため、古い実装のシグナル関連の問題は発生しません。一方、カーネルとハードウェアに固有のシステムのタイマー解決の影響を受けます。 usleepマニュアルページから、言っ

POSIX.1-2001が廃止され、この関数を宣言します。代わりにnanosleep(2)を使用してください。 POSIX.1-2008では、usleep()の仕様が削除されています。

関連する問題