Почему 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.