11

usleepのドキュメントには、呼び出しは無効であると記載されusleep(0)ています。ただし、以下の C++ コードの小さなスニペットを実行している私のシステム (RHEL 5.2) では、実際には と同じ効果があるように見えることがわかりましたusleep(1)。これは予想されることですか? もしそうなら、ドキュメントと実際に目にするものとの間に矛盾があるのはなぜですか?

展示物A

コード:

#include <unistd.h>

int main()
{
    for( int i = 0; i < 10000; i++ )
    {
        usleep(1);
    }
}

出力:

$ time ./test
real   0m10.124s
user   0m0.001s
sys    0m0.000s

展示B

コード:

#include <unistd.h>

int main()
{
    for( int i = 0; i < 10000; i++ )
    {
        usleep(1);
        usleep(0);
    }
}

出力:

$ time ./test
real   0m20.770s
user   0m0.002s
sys    0m0.001s
4

7 に答える 7

15

技術的には、影響はないはずです。ただし、渡された値は絶対値ではなく最小値として使用されることを覚えておく必要があります。したがって、システムは可能な限り最小の間隔を自由に使用できます。

于 2012-10-10T16:08:26.100 に答える
5

ここで使用されている time コマンドについて指摘したかっただけです。プログラムメモリ、CPU、時間統計を確認したい場合は、コマンド/usr/bin/timeだけではなく使用する必要があります。timeフルパスなしで time を呼び出すと、組み込みの time コマンドが呼び出されます。違いを見てください。

フルパスなし:

# time -v ./a.out
-bash: -v: command not found

real    0m0.001s
user    0m0.000s
sys     0m0.001s

フルパスで:

# /usr/bin/time -v ./a.out
Command being timed: "./a.out"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:10.87
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 220
Voluntary context switches: 10001
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

マニュアルに使用しman time、組み込みの時刻情報に使用します。 /usr/bin/timehelp time

于 2013-11-26T08:32:19.273 に答える
3

確認するためにソースを調べる必要がありますが、私の推測では、それはまったく「効果がない」わけではありませんが、おそらくそれよりも少ないでしょうusleep(1)- 関数呼び出しのオーバーヘッドがまだあります。ライブラリ呼び出しは単にその引数をチェックしてすぐに戻り、タイマー/コールバックを設定してスケジューラを呼び出すというより一般的なプロセスを回避します。

于 2012-10-10T16:08:17.487 に答える
3

usleep()システムコールにsleep()変換されます。プログラムをnanosleep()試してみてください。nanosleep() マニュアルstraceから:

   nanosleep() suspends the execution of the calling thread until either
   at least the time specified in *req has elapsed, or the delivery of a
   signal that triggers the invocation of a handler in the calling
   thread or that terminates the process.

したがって、ulseep(0) は割り込みとコンテキスト スイッチを生成すると思います。

于 2015-02-09T22:03:00.317 に答える
2

そのドキュメントは 1997 年から戻ってきました。現在の RHEL5 に適用されるかどうかはわかりません。usleep に関する私の Redhat dev システムのマニュアル ページには、スリープ時間が 0 の場合は効果がないことが示されていません。

渡すパラメーターは、スリープの最小時間です。指定された正確な時間後にスレッドがウェイクアップするという保証はありません。スケジューラの特定のダイナミクスを考えると、予想よりも長い遅延が発生する可能性があります。

于 2012-10-10T16:08:01.703 に答える
1

また、udelay が短期間のビジー ループとして実装されているかどうかにも依存します。

于 2012-10-10T20:53:31.980 に答える