为什么clock_nanosleep优于nanosleep来在C中创建睡眠时间?

时间:2011-10-17 14:05:42

标签: c linux linux-kernel system-calls

两个功能中哪一个更好

#include <time.h>
int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp);

OR

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

2 个答案:

答案 0 :(得分:15)

clock_nanosleep优于nanosleep的优点是:

  1. 您可以指定睡眠的绝对时间,直到而不是睡眠间隔。这对于实时(挂起时间)时钟有所不同,可以由管理员或ntpd等重置。使用nanosleep并预先计算睡眠间隔以达到给定的绝对时间,你'如果时钟复位并且所需时间“早”到达,则无法唤醒。此外,还有一个使用间隔时间进行调度的竞争条件:如果您计算要休眠的间隔,但是在调用nanosleep之前先被抢占并且暂时不再安排,您将再次入睡长。
  2. 您可以在实时时钟以外的计时器上睡觉。最有用的通常是单调时钟(不能复位并随着实际时间的推移而单调增加),但也有其他有趣的应用程序,例如在多线程进程中有一个线程睡眠进程的cpu时钟(因此它在进程使用了​​给定量的cpu时间后唤醒。)

答案 1 :(得分:7)

在我的系统上,man 2 clock_nanosleep解释了这两个功能之间的差异:

   Like  nanosleep(2), clock_nanosleep() allows the caller to sleep for an
   interval specified with nanosecond precision.  It differs  in  allowing
   the  caller  to select the clock against which the sleep interval is to
   be measured, and in allowing the sleep  interval  to  be  specified  as
   either an absolute or a relative value.

   The clock_id argument [...] can have one of the following values:

   CLOCK_REALTIME   A settable system-wide real-time clock.

   CLOCK_MONOTONIC  A non-settable, monotonically  increasing  clock  that
                    measures time since some unspecified point in the past
                    that does not change after system startup.

   CLOCK_PROCESS_CPUTIME_ID
                    A settable per-process clock that  measures  CPU  time
                    consumed by all threads in the process.