2012-07-12 7 views
13

se la funzione chiamata dal pthread_create ha la seguente strutturaperché pthread_exit lancia qualcosa catturato da ellissi?

try{ 
    ...code.... 
    pthread_detach(pthread_self()); 
    pthread_exit(NULL); 
}catch(...){ 
    std::cout<<"I am here"<<std::endl; 
} 

perché il gestore di eccezioni per i puntini di sospensione ottenere chiamato alla esecuzione di pthread_exit? (si noti che std::exception, per esempio, non sono gettati)

+0

Che compilatore vedi sotto? –

+0

@Fabio Forse un distruttore di un oggetto sulla pila viene lanciato. –

+0

@DaveS g ++ TorstenRobitzki grazie, ho pensato lo stesso, ma il caso era quello spiegato da eran –

risposta

22

pthread_exit potrebbe un'eccezione ___forced_unwind, che viene utilizzato per lo svolgimento pila durante l'uscita del filo. Non eredita da std::exception e pertanto non può essere catturato come uno. Se lo fai prendere tale eccezione, essere sicuri di ri- throw in modo che possa fare il suo lavoro:

try { 
... 
} catch (abi::___forced_unwind&) { 
    throw; 
} catch (...) { 
    // whatever 
} 

Il motivo viene generata un'eccezione è che pthread_exit è specificato non tornare mai più. Avendolo lanciato garantisce la pulizia delle variabili allocate nello stack e nessuna esecuzione del codice dopo la sua posizione (a meno che non si rilevi l'eccezione di svolgimento ...).

BTW, questo è un altro caso in cui l'idioma catch (...) fa più male che bene. A volte è usato per "stabilizzare" il codice che sta generando eccezioni sconosciute. Ma ciò rimuove la visibilità del danno solo in un secondo momento e luogo, rendendo impossibile identificare la vera origine del problema. L'unica cosa ragionevole da fare in questo tipo di cattura sono le pulizie minime, possibilmente il logging e poi il riavvolgimento. Un processo che si arresta in modo anomalo a causa di un'eccezione non gestita non è una bella vista, ma può fornire un dump di arresto anomalo debugabile che mostra chiaramente il comando errato. Ma questo è solo il mio rancore contro catch (...), che è a malapena collegato a pthread_exit ...

+0

Grazie mille, questo era esattamente il caso! e credo che il tiro è per prevenire FATAL: eccezione non rilanciati grazie! –

+0

+1 Molto interessante! –

+1

@Fabio: L'eccezione di abi :: __ forced_unwind' può anche essere generata in thread che sono stati cancellati con 'pthread_cancel'. Prestare attenzione con i punti di sospensione nell'eliminare quando si terminano i pthread. –