Почему clock nanosleep предпочтительнее nanosleep для создания времени сна в C?

какая из двух функций лучше

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

или

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

2 ответов


преимущества clock_nanosleep над nanosleep являются:

  1. вы можете указать абсолютное время спать до а не интервал для сна. Это имеет значение для часов реального времени (настенного времени), которые могут быть сброшены администратором или ntpd, etc. С nanosleep и предварительно вычисляя интервал для сна, чтобы достичь заданного абсолютного времени, вы не сможете проснуться, если часы сброшены и желаемое время прибывает "рано". Кроме того, есть условие гонки при планировании с использованием интервальных времен: если вы вычисляете интервал, который вы хотите спать, но вы получаете preempted перед вызовом nanosleep и не планируйте снова какое-то время, вы снова будете спать слишком долго.
  2. вы можете спать на таймерах, отличных от часов реального времени. Наиболее полезными обычно являются монотонные часы (которые не могут быть сброшены и монотонно увеличиваются с прогрессированием фактического времени), но есть и другие интересные приложения, такие как наличие одного потока в многопоточный процесс сна на процессоре часы времени (так что он просыпается после того, как процесс использовал заданное количество времени процессора).

в моей системе 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.