2010-08-27 13 views
6

Se si dispone di un programma con multithreading (kernel Linux 2.26) e un thread esegue qualcosa che causa un segfault, gli altri thread saranno ancora pianificati per l'esecuzione? Come sono finiti gli altri thread? Qualcuno può spiegare la procedura di arresto del processo per quanto riguarda i programmi multithreaded?Come sono terminati i thread durante un crash di Linux?

risposta

6

Quando un segnale fatale viene inviato a un thread, viene chiamata la funzione do_coredump() o do_group_exit(). do_group_exit() imposta il codice di uscita del gruppo di thread e segnala a tutti gli altri thread nel gruppo di thread di uscire con zap_other_threads(), prima di uscire dal thread . (do_coredump() chiama coredump_wait() che analogamente chiama zap_threads()).

zap_other_threads() invia un SIGKILL per ogni altro thread nel gruppo di thread e lo riattiva con signal_wake_up(). signal_wake_up() chiama kick_process(), che avvia il thread in modalità kernel in modo che possa ricevere il segnale, utilizzando un IPI se necessario (ad esempio se è in esecuzione su un'altra CPU).


1. Inter-Processor Interrupt

+0

È questo in get_signal_to_deliver? Mi sembra che do_group_exit venga chiamato dopo do_coredump (nel caso di coredump). È possibile che altri thread continuino a essere eseguiti mentre si sta eseguendo il codedump? Non mi è chiaro cosa faccia lo zap_threads. – Andrew

+0

@abellia: 'do_coredump()' non ritorna mai, quindi o * o * 'do_group_exit()' viene chiamato. 'zap_threads()' è molto simile a 'zap_other_threads()' - pubblica anche un 'SIGKILL' e sveglia il bersaglio. 'do_coredump()' uccide tutti i thread e attende che escano, quindi scrive effettivamente il file core. – caf

5

L'altro thread sarà ancora pianificato per l'esecuzione?

No. Il SEGV è un problema a livello di processo. A meno che tu non abbia gestito il SEGV (che è quasi sempre una cattiva idea) l'intero processo uscirà e tutti i thread con esso.

Ho il sospetto che gli altri thread non siano gestiti molto bene. Se il gestore chiama exit() o _exit(), i gestori di cleanup thread non verranno richiamati. Questa potrebbe essere una buona cosa se il tuo programma è gravemente danneggiato, sarà difficile fidarsi di gran parte di qualcosa dopo un errore di seg.

Una nota dalla pagina signal man:

Secondo POSIX, il comportamento di un processo è indefinito dopo che ignora un SIGFPE, SIGILL, o il segnale SIGSEGV che non è stato generato dalla kill (2) o le funzioni raise (3).

Dopo un segfault, davvero non si vuole fare altro che uscire da quel programma.

Problemi correlati