Какую временную функцию мне нужно использовать с pthread_cond_timedwait? - PullRequest
11 голосов
/ 09 июня 2010

Для функции pthread_cond_timedwait требуется абсолютное время в структуре time -pec.

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

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

Ответы [ 3 ]

14 голосов
/ 21 ноября 2010

Используемая функция - 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 голосов
/ 09 июня 2010

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

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

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

0 голосов
/ 09 июня 2010

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

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

timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

, который будет также возвращать наносекунды.

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

...