J'ai un problème étrange. J'ai le code suivant:pthread_cond_timedwait retourner immédiatement
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
appels gettimeofday
avant chaque ligne et la ligne avec prepends le temps. Il en résulte la sortie suivante:
7.991151: condwait: timeout = 5, 705032704
7.991158: cond timed out
Comme vous pouvez le voir, seulement 7 microsecondes passé entre les deux lignes de débogage, mais pthread_cond_timedwait
retourné ETIMEDOUT
. Comment cela peut-il arriver? J'ai même essayé de régler l'horloge à quelque chose d'autre lors de l'initialisation de 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);
(aucun des messages d'erreur sont imprimés). J'ai essayé les deux CLOCK_REALTIME
et CLOCK_MONOTONIC
.
Ce code fait partie d'une file d'attente de blocage. J'ai besoin d'une fonctionnalité telle que si rien n'est mis dans cette file d'attente en 5 secondes, il se passe quelque chose d'autre. Le mutex et le cond sont tous deux initialisés, car la file d'attente de blocage fonctionne correctement si je n'utilise pas pthread_cond_timedwait
.
Oh, j'ai compris. Vous pouvez utiliser pthread_get_expiration_np() pour déterminer l'heure abs. – Claudiu
@Claudiu pthread_get_expiration_np() n'est pas disponible sur mon GNU/Linux. Au lieu de cela je devais: 'timeval maintenant; gettimeofday (& maintenant, NULL); long int abstime_ns_large = maintenant.tv_usec * 1000 + delay_ns; timespec abstime = {now.tv_sec + (abstime_ns_large/1000000000), abstime_ns_large% 1000000000}; 'où delay_ns est le délai désiré en nanosecondes.Utilisez ensuite abstime dans votre appel pthread_cond_timedwait. –