2010-06-09 6 views
10

La funzione pthread_cond_timedwait richiede un tempo assoluto in una struttura timepec.Che funzione del tempo devo usare con pthread_cond_timedwait?

Quale funzione del tempo si suppone di utilizzare per ottenere il tempo assoluto. Ho visto molti esempi sul web e ho trovato la funzione quasi sempre utilizzata. (ftime, clock, gettimeofday, clock_gettime (con tutti i possibili CLOCK _...)

Il tempo di pthread_cond_timedwait utilizza un tempo assoluto: il tempo di attesa verrà influenzato dal cambiamento del tempo della macchina? una delle funzioni del tempo, se il tempo della macchina cambia tra get e l'aggiunta del delta, questo influenzerà il tempo di attesa? C'è invece la possibilità di attendere un evento con un tempo relativo?

risposta

13

La funzione da utilizzare è clock_gettime() con l'id di orologio della variabile di condizione. Questo ID orologio è CLOCK_REALTIME per impostazione predefinita, ma può essere modificato (ad esempio CLOCK_MONOTONIC) inizializzando la variabile di condizione con uno pthread_condattr_t su cui è stato chiamato pthread_condattr_setclock().

L'utilizzo di time() non è una buona idea poiché non è garantito uguale a tv_sec di clock_gettime(CLOCK_REALTIME). In alcuni casi ciò può causare l'attesa del programma, attendere time() per raggiungere il secondo che era già stato raggiunto da clock_gettime(CLOCK_REALTIME) poco tempo fa.

+4

clock_gettime (CLOCK_MONOTONIC) è il modo per ottenere un tempo che è solo in aumento, quindi non influenzato modificando l'ora del sistema. L'inizializzazione dell'attributo della condizione con pthread_condattr_setclock con CLOCK_MONOTONIC renderà pthread_cond_timedwait attendere con un tempo relativo. – Vincent

0

timespec è solo un tempo in secondi (time_t) con nanosecondi aggiuntivi. È possibile utilizzare il tempo relativo con cond_relative_timed_wait.

Per ottenu n ora di sistema corrente in time_t modulo chiamata time(NULL); da "time.h". Più preciso sarebbe utilizzare

timespec ts; 
clock_gettime(CLOCK_REALTIME, &ts); 

che restituirà anche nanosecondi.

È possibile utilizzare anche altre funzioni, ma il risultato finale deve essere convertito in numero di secondi e numero di nanosecondi.

+2

Non riesco a trovare la definizione della funzione cond_relative_timed_wait(). Dove è definito? – Vincent

2

Ho usato clock_gettime con CLOCK_REALTIME me stesso. Questo dovrebbe funzionare in modo soddisfacente e consentire di creare facilmente un timepec assoluto al timeout a.

In effetti esiste la possibilità che il tempo macchina avanzerà mentre si effettua l'impostazione di attesa. In generale, se stai aspettando una piccola quantità di tempo che ciò potrebbe avere importanza, non ti sarà più vicino al tempo di attivazione richiesto come speri comunque. Se il tempo richiesto è già trascorso dal momento in cui viene effettuata la chiamata a tempo, dovrebbe semplicemente svegliarsi immediatamente.

Solaris fornisce pthread_cond_reltimedwait_np, (np per indicare non portatile) ma non sono a conoscenza di alcuna funzione di questo tipo su Linux. Suggerirei di aspettare solo il tempo assoluto e, se necessario, implementare un parente.

+1

È un peccato che non ci sia una versione basata su "CLOCK_MONOTONIC'. – caf

+0

Il clock_gettime con CLOCK_REALTIME è "pesante" nelle risorse di basso livello? – Vincent

+0

Non ci credo, ma il modo migliore per scoprirlo è profilare la tua applicazione specifica e se mostra che il 'clock_gettime' è un problema significativo, allora cerca di ottimizzarlo. –