c++ - pthread_mutex_init - CLOCK_MONOTONIC y pthread_mutex_timedlock/pthread_cond_timedwait
pthreads php (2)
Después de consultar la documentación y pthread.h
, no puedo encontrar una manera de hacer que pthread_mutex_timedlock use CLOCK_MONOTONIC
así que supongo que eso no es posible (actualmente). Para pthread_cond_timedwait , sin embargo, puedes usar código como este:
pthread_condattr_t attr;
pthread_cond_t cond;
/* ... */
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &attr);
He omitido la verificación del código de error para mayor claridad, pero, por supuesto, debes hacerlo.
Asumo que se usa CLOCK_REALTIME
porque siempre está disponible, mientras que en principio CLOCK_MONOTONIC
es opcional. Además, me pregunto si la configuración de los tiempos de espera absolutos facilita la recuperación después de que las llamadas al sistema se interrumpan por señales y similares.
Sin embargo, parece bastante inconsistente que el reloj se pueda configurar en algunos casos y no en otros; realmente debería haber un pthread_mutexattr_setclock()
, pero lamentablemente no parece haber uno. ¡Supongo que tendrás que esperar que alguien no ponga el reloj!
La documentación de pthread_mutex_timedlock dice que abs_timeout
toma un CLOCK_REALTIME
. Sin embargo, todos sabemos que no es apropiado para cronometrar una duración específica (debido a los ajustes de tiempo del sistema).
¿Hay alguna manera de hacer que el tiempo de espera de bloqueo de CLOCK_MONOTONIC
en CLOCK_MONOTONIC
sea portátil? Lo mismo ocurre con pthread_cond_timedwait.
En OS X y FreeBSD, puedes usar kqueue
y kevent
. Vea mi respuesta aquí: https://.com/a/31174803/432