2013-01-09 4 views
16

Il pthread_mutex_timedlock documentation dice che abs_timeout prende un CLOCK_REALTIME. Tuttavia, sappiamo tutti che non è opportuno cronometrare una durata specifica (a causa di aggiustamenti temporali del sistema).CLOCK_MONOTONIC e pthread_mutex_timedlock/pthread_cond_timedwait

C'è un modo per rendere il timeout del blocco pthread su CLOCK_MONOTONIC che è portatile? Lo stesso vale per pthread_cond_timedwait.

+0

Non è inappropriato. Devi solo impostare il fuso orario locale dell'applicazione su UTC. –

+4

@ MahmoudAl-Qudsi No. Ciò non impedisce il cambio dell'orologio in tempo reale. –

+0

È possibile utilizzare un thread di watchwatch che trasmette tutte le variabili condizionate registrate nel caso in cui l'orologio salti all'indietro. –

risposta

17

aver guardato la documentazione e pthread.h, non riesco a trovare un modo per rendere l'uso pthread_mutex_timedlockCLOCK_MONOTONIC quindi immagino che non è (al momento) possibile. Per pthread_cond_timedwait, tuttavia, è possibile utilizzare il codice come questo:

pthread_condattr_t attr; 
pthread_cond_t cond; 
/* ... */ 
pthread_condattr_init(&attr); 
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 
pthread_cond_init(&cond, &attr); 

ho omesso codice di controllo degli errori per chiarezza, ma naturalmente si dovrebbe fare questo.

Suppongo che sia utilizzato CLOCK_REALTIME perché è sempre disponibile mentre in linea di principio CLOCK_MONOTONIC è facoltativo. Inoltre, mi chiedo se impostare timeout assoluti renda più facile il recupero dopo che le chiamate di sistema vengono interrotte da segnali e simili.

Tuttavia, sembra del tutto incoerente che l'orologio può essere impostato in alcuni casi e non altri - ci realmente dovrebbe essere un pthread_mutexattr_setclock(), ma purtroppo non sembra essere uno. Immagino che dovrai solo sperare che qualcuno non imposti l'orologio!

+3

Questo è buono su Linux. 'pthread_condattr_setclock' non è disponibile su OS X e non sono stato in grado di trovare una soluzione che funzioni su OS X. – andrewrk

+0

Sembra che anche altre persone si siano imbattuti in questo: https://github.com/nanomsg/nanomsg/issues/ 10 – Cartroo

+0

Sto per fare qualche esperimento, ma potrei essermi imbattuto in una soluzione qui: http://stackoverflow.com/questions/11338899/are-there-any-well-behaved-posix-interval-timers/ 31174803 # 31174803 – andrewrk