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