Функция 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);
который вернет также наносекунды.
Можно использовать и другие функции, но конечный результат должен быть преобразован в число секунд и количество наносекунд.