Ho uno strano problema. Ho il seguente codice:pthread_cond_timedwait che restituisce immediatamente
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
chiamate gettimeofday
prima di ogni linea e antepone la riga con il tempo. Essa si traduce nel seguente output:
7.991151: condwait: timeout = 5, 705032704
7.991158: cond timed out
Come si può vedere, solo 7 microsecondi passati tra le due linee di debug, ma pthread_cond_timedwait
restituito ETIMEDOUT
. Come può accadere? Ho anche provato a fissare l'orologio per qualcosa d'altro quando si inizializza la variabile 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);
(nessuno dei messaggi di errore vengono stampati). Ho provato sia CLOCK_REALTIME
e CLOCK_MONOTONIC
.
Questo codice è parte di una coda di blocco. Ho bisogno di funzionalità tali che se nulla viene messo in coda in 5 secondi, succede qualcos'altro. Il mutex e il cond sono entrambi inizializzati, poiché la coda di blocco funziona bene se non utilizzo pthread_cond_timedwait
.
Oh capito. È possibile utilizzare pthread_get_expiration_np() per capire che cos'è il tempo abs. – Claudiu
@Claudiu pthread_get_expiration_np() non è disponibile sulla mia GNU/Linux. Invece ho dovuto: 'ora timida; gettimeofday (& now, 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}; 'dove delay_ns è il ritardo desiderato in nanosecondi.Quindi utilizzare abstime nella chiamata pthread_cond_timedwait. –