Come si eliminano in modo sicuro oggetti C++ statici nel caso in cui più thread (Posix) chiamano in parallelo exit()
?distruttori statici sicuri quando più thread chiamano exit()
Appare nel mio ambiente CentOS6 che exit()
esegue atexit
(o on_exit
) funzioni di pulizia chiamando qualcosa come fct[--cnt]()
dove cnt
è il numero di gestori registrati. Quando più thread chiamano exit()
allo stesso tempo, abbiamo una condizione di competizione nell'operazione --cnt
10 non protetta e alcuni gestori possono essere saltati o richiamati più volte (causando l'arresto occasionale). Quindi, come posso assicurarmi che solo uno dei thread di chiamata exit()
effettui la pulizia e tutti gli altri si fermino? Nota che inserire un pthread_mutex_lock()
in un gestore di cleanup non aiuta perché questo gestore potrebbe essere saltato ...
Purtroppo non posso evitare che più thread chiamino exit()
perché è il codice che i miei utenti scriveranno (sto fornendo un biblioteca a loro).
Alla ricerca di idee sicure, grazie!
Di cosa ti preoccupi esattamente? Hai qualcosa nei tuoi oggetti allocati staticamente che DEVONO essere clenati (se sì cosa)? È generalmente sicuro di uscire senza ripulire in moderni SO sofisticati. Se si deve eseguire la pulizia, suggerirei che probabilmente è necessario trovare una soluzione migliore piuttosto che lasciare la chiamata al codice client di uscita, ad esempio implementare il codice in una libreria condivisa e utilizzare la funzione di pulizia della libreria condivisa per ripulire, forse ? Oppure documenta che "non devi chiamare' exit() ', usa' my_safe_exit() '", e poi fai riferimento a questo quando i clienti si lamentano che non funziona. –
In aggiunta a quanto sopra, cosa succede se i client si bloccano (errore di stack, errore di segmentazione) o debug ed escono nel debugger senza chiamare exit? –
Ho alcuni oggetti statici che C++ distruggerà, ma non possiamo farlo in sicurezza in parallelo (condizioni di competizione nei distruttori).Questa pulizia è necessaria, ad esempio, per chiudere correttamente i flussi di file di traccia, quindi la pulizia automatica dal sistema operativo non è un'opzione. – Rainer