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

#c #linux #linux-kernel #system-calls

#c #linux #linux-ядро #системные вызовы

Вопрос:

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

 #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);
  

Комментарии:

1. Определите «хорошо». Портативный, эффективный, хорошо известный, понятный, точный, что, что, что?

2. Вы читали справочные страницы? linux.die.net/man/3/clock_nanosleep

3. @SanJacinto никто не читает справочные страницы. Это все равно, что я спрашиваю вас: «Вы читали условия обслуживания Facebook» или механик спрашивает вас: «Вы хотя бы читали руководство пользователя», когда вы не можете понять, почему ваши дальние лучи не будут работать = P

Ответ №1:

Преимущества clock_nanosleep over nanosleep заключаются в:

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

Комментарии:

1. Просто хотел добавить комментарий, чтобы избежать путаницы … nanosleep() в Linux использует CLOCK_MONOTONIC clock . Итак, если вы хотите использовать часы, отличные от CLOCK_MONOTONIC в Linux, именно тогда вам понадобится clock_nanosleep() .

2. @It’Spete: для спящих с относительным временем разве они не одинаковы?

Ответ №2:

В моей системе man 2 clock_nanosleep объясняет различия между двумя функциями таким образом:

 Как и nanosleep(2), clock_nanosleep() позволяет вызывающему абоненту спать в течение
интервала, указанного с точностью до наносекунды. Он отличается тем, что позволяет
вызывающей стороне выбирать часы, по которым должен
быть измерен интервал ожидания, и позволяет указывать интервал ожидания
либо как абсолютное, либо как относительное значение.

 Аргумент clock_id [...] может иметь одно из следующих значений:

 CLOCK_REALTIME Настраиваемые общесистемные часы реального времени.

 CLOCK_MONOTONIC неустановляемый, монотонно увеличивающийся тактовый сигнал, который
измеряет время с некоторого неопределенного момента в прошлом
, который не изменяется после запуска системы.

 CLOCK_PROCESS_CPUTIME_ID
 Настраиваемые часы для каждого процесса, которые измеряют время процессора
, потребляемое всеми потоками в процессе.

Комментарии:

1. Спасибо… Я использую стандартную lib-функцию posix precision sleep для перехода в спящий режим, но, похоже, она возвращается слишком быстро. Пожалуйста, изучите этот код и предоставьте подробную информацию о способе восстановления функции для корректного ожидания нужного количества времени.