2010-06-09 12 views
10

La función pthread_cond_timedwait necesita un tiempo absoluto en una estructura de timespec de tiempo.¿Qué función de tiempo necesito usar con pthread_cond_timedwait?

Qué función de tiempo que estoy supone que uso para obtener el tiempo absoluto. Vi un montón de ejemplos en la web y encontré la función casi todo el tiempo utilizada. (ftime, clock, gettimeofday, clock_gettime (con todos los posibles CLOCK _...).

pthread_cond_timedwait usa un tiempo absoluto. ¿Este tiempo de espera se verá afectado al cambiar el tiempo de la máquina? También si obtengo el tiempo absoluto con una de las funciones de tiempo, si el tiempo de la máquina cambia entre la obtención y la suma del tiempo delta, esto afectará el tiempo de espera? ¿Existe la posibilidad de esperar un evento con una hora relativa?

Respuesta

13

La función de utilizar es clock_gettime() con el ID de reloj de la variable de estado. Este Identificación del reloj es CLOCK_REALTIME por defecto, pero se puede cambiar (por ejemplo, a CLOCK_MONOTONIC) inicializando la variable de estado con un pthread_condattr_t sobre la que se ha llamado pthread_condattr_setclock().

Usar time() no es una buena idea porque no se garantiza que sea igual a tv_sec de clock_gettime(CLOCK_REALTIME). En algunos casos, esto puede hacer que su programa esté ocupado, espere time() para alcanzar el segundo que ya se alcanzó por clock_gettime(CLOCK_REALTIME) hace poco tiempo.

+4

clock_gettime (CLOCK_MONOTONIC) es la manera de conseguir un tiempo que sólo está aumentando por lo tanto no afectado por el cambio de la hora del sistema. Inicializar el atributo de la condición con pthread_condattr_setclock con CLOCK_MONOTONIC hará pthread_cond_timedwait esperar con un tiempo relativo. – Vincent

0

timespec es solo un tiempo en segundos (time_t) con nanosegundos adicionales. Puede usar el tiempo relativo con cond_relative_timed_wait.

Para obtener n hora actual del sistema en time_t formulario llame time(NULL); desde "time.h". Más exacto sería usar

timespec ts; 
clock_gettime(CLOCK_REALTIME, &ts); 

que devolverá también nanosegundos.

Otras funciones se pueden utilizar también, pero el resultado final deben ser convertidos a número de segundos y el número de nanosegundos.

+2

No encuentro la definición de la función cond_relative_timed_wait(). Donde se define? – Vincent

2

He usado clock_gettime con CLOCK_REALTIME mí mismo. Eso debería funcionar satisfactoriamente y le permite crear fácilmente un horario de tiempo absoluto para el tiempo de espera en.

De hecho hay una posibilidad de que el tiempo de máquina avanzará mientras haces la configuración de espera. En general, si estás esperando una cantidad de tiempo lo suficientemente pequeña como para que esto importe, no estarás tan cerca de la hora de despertar solicitada como esperas de todos modos. Si su tiempo solicitado ya ha pasado antes de que se realice la llamada de espera con tiempo límite, debería simplemente despertarse inmediatamente.

Solaris proporciona pthread_cond_reltimedwait_np, (np significa no portátil) pero no conozco ninguna función de este tipo en Linux. Sugeriría esperar en el tiempo absoluto y, si es necesario, implementar un pariente.

+1

Es una pena que no haya una versión basada en 'CLOCK_MONOTONIC'. – caf

+0

¿El clock_gettime con CLOCK_REALTIME es "pesado" en los recursos de bajo nivel? – Vincent

+0

No lo creo, pero la mejor manera de averiguarlo es crear un perfil de su aplicación específica y si muestra que 'clock_gettime' es un problema importante solo entonces intente optimizarlo. –

Cuestiones relacionadas