pthread_mutex_t pthread_mutex_init pthread_join pthread_create pthread example c++ c linux pthreads mutex

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