Il modo pulito per sapere se un thread è fatto è chiamare pthread_join()
contro quel thread.
// int pthread_join(pthread_t thread, void **retval);
int retval = 0;
int r = pthread_join(that_thread_id, &retval);
... here you know that_thread_id returned ...
Il problema con pthread_join()
, se il filo non ritorna mai (continua a funzionare come previsto), allora si sono bloccate. Non è quindi molto utile nel tuo caso.
Tuttavia, si può effettivamente verificare se è possibile partecipare (tryjoin) come segue:
//int pthread_tryjoin_np(pthread_t thread, void **retval);
int retval = 0;
int r = pthread_tryjoin_np(that_thread_id, &relval);
// here 'r' tells you whether the thread returned (joined) or not.
if(r == 0)
{
// that_thread_id is done, create new thread here
...
}
else if(errno != EBUSY)
{
// react to "weird" errors... (maybe a perror() at least?)
}
// else -- thread is still running
C'è anche un temporizzata join che attendere il periodo di tempo specificato, come un paio di secondi. A seconda del numero di thread da controllare e se il tuo processo principale si trova in un'altra posizione, potrebbe essere una soluzione. Blocca sul thread 1 per 5 secondi, quindi sul thread 2 per 5 secondi, ecc. Che sarebbe 5.000 secondi per loop per 1.000 thread (circa 85 minuti per aggirare tutti i thread con il tempo necessario per gestire le cose ...)
C'è un codice di esempio nella pagina man che mostra come usare la funzione pthread_timedjoin_np(). Tutto quello che dovresti fare è mettere un ciclo per controllare ciascuno dei tuoi thread.
struct timespec ts;
int s;
...
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
/* Handle error */
}
ts.tv_sec += 5;
s = pthread_timedjoin_np(thread, NULL, &ts);
if (s != 0) {
/* Handle error */
}
Se il processo principale ha altre cose da fare, vorrei suggerire di non utilizzare la versione a tempo e basta andare attraverso tutti i fili il più velocemente possibile.
Sono curioso di sapere se questo può essere rilevato senza un thread di watchdog, ma sono abbastanza sicuro che devi lasciare la "ricreazione del thread morto" a un gestore thread al di fuori del gestore di segnale. (Ma non ho mai provato veramente a fare una cosa del genere, quindi potrei sbagliarmi) – Shahbaz
Sono curioso di sapere cosa intendi con "terminato a causa di un errore". Se un thread seghaults l'intero processo insieme a tutti gli altri thread segfaults. – alk
sto lavorando su un webserver multi-thread, quando il numero di thread è inferiore a un numero fisso, il server termina. Non so perché i thread vengono terminati nel programma, il server serve circa 1000 connessioni, quindi termina. – CodeRed