Почему clock_nanosleep предпочтительнее, чем nanosleep, для создания времен сна в C? - PullRequest
10 голосов
/ 17 октября 2011

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

#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 ]

16 голосов
/ 17 октября 2011

Преимущества clock_nanosleep над nanosleep:

  1. Вы можете указать абсолютное время для сна до , а не интервал для сна. Это имеет значение для часов реального времени (настенного времени), которые могут быть сброшены администратором или ntpd и т. Д. С nanosleep и предварительным вычислением интервала ожидания для достижения заданного абсолютного времени вы не сможете проснуться если часы сброшены и желаемое время наступает «рано». Кроме того, существует условие гонки с расписанием с использованием интервалов: если вы вычисляете интервал, который хотите перевести в режим сна, но перед вызовом nanosleep вы получаете прерывание и не планируете его снова на некоторое время, вы снова будете спать слишком долго.
  2. Вы можете спать на таймерах, отличных от часов реального времени. Наиболее полезными обычно являются монотонные часы (которые не могут быть сброшены и монотонно увеличиваются с увеличением фактического времени), но есть и другие интересные приложения, например, когда один поток находится в многопоточном спящем процессе на часах процессора. (поэтому он просыпается после того, как процесс использует определенное количество времени процессора).
7 голосов
/ 17 октября 2011

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

...