Attenersi a pthread_cond_timedwait
e usa clock_gettime
. Ad esempio:
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);
Avvolgilo in una funzione se lo desideri.
AGGIORNAMENTO:integrando la risposta in base ai nostri commenti.
POSIX non ha una singola API per attendere "tutti i tipi" di eventi/oggetti come fa Windows. Ognuno ha le sue funzioni. Il modo più semplice per notificare un thread per la terminazione è utilizzare variabili/operazioni atomiche. Ad esempio:
Discussione principale:
// 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);
Discussione secondaria:
// 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
Un'altra alternativa è inviare una richiesta di cancellazione utilizzando pthread_cancel
. Il thread cancellato deve aver chiamato pthread_cleanup_push
per registrare qualsiasi gestore di pulizia necessario. Questi gestori vengono richiamati nell'ordine inverso in cui sono stati registrati. Non chiamare mai pthread_exit
da un gestore di pulizia, perché è un comportamento indefinito. Lo stato di uscita di un thread annullato è PTHREAD_CANCELED
. Se opti per questa alternativa, ti consiglio di leggere principalmente sui punti e sui tipi di cancellazione.
E, ultimo ma non meno importante, chiamare pthread_join
farà bloccare il thread corrente fino a quando il thread passato dall'argomento non termina. Come bonus, otterrai lo stato di uscita del thread.
Per quello che vale, noi (NeoSmart Technologies) abbiamo appena rilasciato una libreria open source (con licenza MIT) chiamata pevents che implementa eventi manuali e di ripristino automatico WIN32 su POSIX e include sia i cloni WaitForSingleObject che WaitForMultipleObjects.
Anche se ti consiglierei personalmente di utilizzare i paradigmi di segnalazione e multithreading POSIX durante la codifica su macchine POSIX, pevents ti offre un'altra scelta se ne hai bisogno.