Какую функцию времени мне нужно использовать с pthread_cond_timedwait?

Функция pthread_cond_timedwait нуждается в абсолютном времени в структуре time timespec.

Какую функцию времени я использую для получения абсолютного времени. Я видел много примеров в Интернете, и я нашел почти все функции времени. (ftime, clock, gettimeofday, clock_gettime (со всеми возможными CLOCK _...).

В pthread_cond_timedwait используется абсолютное время. Будет ли это время ожидания повлиять на изменение времени работы машины? Также, если я получаю абсолютное время с одной из функций времени, если время работы машины изменяется между get и добавлением времени дельта, это повлияет на время ожидания? Есть ли возможность ожидать события с относительным временем?

Ответ 1

Используемая функция clock_gettime() с идентификатором часов переменной условия. Этот идентификатор синхронизации по умолчанию равен CLOCK_REALTIME, но может быть изменен (например, на CLOCK_MONOTONIC) путем инициализации переменной условия с помощью pthread_condattr_t, на котором был вызван pthread_condattr_setclock().

Использование time() не является хорошей идеей, потому что это не гарантируется равным tv_sec для clock_gettime(CLOCK_REALTIME). В некоторых случаях это может привести к оживлению вашей программы - дождитесь, пока time() достигнет второго, которое уже было достигнуто с помощью clock_gettime(CLOCK_REALTIME) несколько минут назад.

Ответ 2

Я использовал clock_gettime с CLOCK_REALTIME сам. Это должно работать удовлетворительно и позволит вам легко создать абсолютный тайм-аут в timeout.

Действительно, существует вероятность того, что машинное время будет продвигаться, пока вы выполните настройку ожидания. В общем, если вы ждёте достаточно небольшого количества времени, чтобы это имело бы значение, вы не сможете приблизиться к запрашиваемому времени пробуждения, как вы надеетесь в любом случае. Если ваше запрошенное время уже прошло к моменту выполнения вызова timedwait, он должен сразу просыпаться.

Solaris предоставляет pthread_cond_reltimedwait_np, (np означает не переносимый), но я не знаю никакой такой функции в Linux. Я предлагаю просто ждать в абсолютное время и, при необходимости, выполнять относительное ожидание самостоятельно.

Ответ 3

timespec - это всего лишь время в секундах (time_t) с дополнительными наносекундами. Вы можете использовать относительное время с помощью cond_relative_timed_wait.

Чтобы получить текущее системное время в форме time_t, вызовите time(NULL); с "time.h". Более точным было бы использовать

timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

который вернет также наносекунды.

Можно использовать и другие функции, но конечный результат должен быть преобразован в число секунд и количество наносекунд.