Cíñete a pthread_cond_timedwait
y usa clock_gettime
. Por ejemplo:
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
ret = pthread_cond_timedwait(&cond, &mutex, &ts);
Envuélvalo en una función si lo desea.
ACTUALIZACIÓN:complementando la respuesta basada en nuestros comentarios.
POSIX no tiene una sola API para esperar "todos los tipos" de eventos/objetos como lo hace Windows. Cada uno tiene sus propias funciones. La forma más sencilla de notificar la finalización de un subproceso es utilizando variables/operaciones atómicas. Por ejemplo:
Hilo principal:
// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);
// "Signal" termination by changing the initial value
atomic_inc(&must_terminate);
Hilo secundario:
// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
// Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status
Otra alternativa es enviar una solicitud de cancelación usando pthread_cancel
. El hilo que se está cancelando debe haber llamado pthread_cleanup_push
para registrar cualquier controlador de limpieza necesario. Estos controladores se invocan en el orden inverso al que se registraron. Nunca llames a pthread_exit
de un controlador de limpieza, porque es un comportamiento indefinido. El estado de salida de un hilo cancelado es PTHREAD_CANCELED
. Si optas por esta alternativa, te recomiendo leer principalmente sobre puntos y tipos de cancelación.
Y por último, pero no menos importante, llamar a pthread_join
hará que el subproceso actual se bloquee hasta que finalice el subproceso pasado por el argumento. Como bonificación, obtendrá el estado de salida del hilo.
Por si sirve de algo, nosotros (NeoSmart Technologies) acabamos de lanzar una biblioteca de código abierto (con licencia MIT) llamada pevents que implementa eventos de reinicio manual y automático de WIN32 en POSIX, e incluye clones de WaitForSingleObject y WaitForMultipleObjects.
Aunque personalmente le aconsejo que use los paradigmas de señalización y subprocesos múltiples POSIX al codificar en máquinas POSIX, pevents le ofrece otra opción si la necesita.