Tengo un problema extraño. Tengo el siguiente código:pthread_cond_timedwait que vuelve inmediatamente
dbg("condwait: timeout = %d, %d\n",
abs_timeout->tv_sec, abs_timeout->tv_nsec);
ret = pthread_cond_timedwait(&q->q_cond, &q->q_mtx, abs_timeout);
if (ret == ETIMEDOUT)
{
dbg("cond timed out\n");
return -ETIMEDOUT;
}
dbg
gettimeofday
llamadas antes de cada línea y antepone la línea con el tiempo. El resultado es el siguiente resultado:
7.991151: condwait: timeout = 5, 705032704
7.991158: cond timed out
Como se puede ver, sólo 7 microsegundos pasaron entre las dos líneas de depuración, sin embargo pthread_cond_timedwait
regresaron ETIMEDOUT
. ¿Cómo puede pasar esto? Incluso he intentado ajustar el reloj a otra cosa cuando se inicializa la variable cond:
int ret;
ret = pthread_condattr_init(&attributes);
if (ret != 0) printf("CONDATTR INIT FAILED: %d\n", ret);
ret = pthread_condattr_setclock(&attributes, CLOCK_REALTIME);
if (ret != 0) printf("SETCLOCK FAILED: %d\n", ret);
ret = pthread_cond_init(&q->q_cond, &attributes);
if (ret != 0) printf("COND INIT FAILED: %d\n", ret);
(ninguno de los mensajes de error se imprime). Intenté ambos CLOCK_REALTIME
y CLOCK_MONOTONIC
.
Este código es parte de una cola de bloqueo. Necesito una funcionalidad tal que si no se pone nada en esta cola en 5 segundos, ocurra algo más. El mutex y el cond se inicializan, ya que la cola de bloqueo funciona bien si no utilizo pthread_cond_timedwait
.
Oh, lo tengo. Puede usar pthread_get_expiration_np() para averiguar cuál es el tiempo de abs. – Claudiu
@Claudiu pthread_get_expiration_np() no está disponible en mi GNU/Linux. En cambio, tuve que: 'timeval ahora; gettimeofday (y ahora, NULL); long int abstime_ns_large = now.tv_usec * 1000 + delay_ns; timespec abstime = {now.tv_sec + (abstime_ns_large/1000000000), abstime_ns_large% 1000000000}; 'donde delay_ns es el retardo deseado en nanosegundos.A continuación, utilice un período de cinco minutos en su llamada pthread_cond_timedwait. –