Sto lavorando a una libreria in cui sto eseguendo varie attività su alcune librerie di terze parti che eseguono lavori relativamente specifici o pericolosi della piattaforma. (Nello specifico, sto scrivendo un parser di funzioni matematiche che chiama i compilatori JIT, come LLVM o libjit, per creare codice macchina.) In pratica, queste librerie di terze parti hanno la tendenza ad essere bloccate (parte di questo è colpa mia , certo, ma voglio ancora un po 'di assicurazione).Come isolare un lavoro/thread dagli arresti anomali
Mi piacerebbe, quindi, essere in grado di gestire con grazia un lavoro che sta morendo orribilmente - SIGSEGV, SIGILL, ecc. - senza far cadere il resto del mio codice (o il codice degli utenti che chiamano il mio funzioni della libreria). Per essere chiari, non mi interessa se quel particolare lavoro può continuare (non ho intenzione di provare a riparare una condizione di crash), né mi preoccupo veramente dello stato degli oggetti dopo un tale crash (scarterei li immediatamente se c'è un incidente). Voglio solo essere in grado di rilevare che si è verificato un arresto anomalo, interrompere il crash dall'eliminazione dell'intero processo, interrompere la chiamata a qualsiasi arresto anomalo e riprendere l'esecuzione.
(Per un po 'più di contesto, il codice in questo momento è un ciclo for, testare ciascuna delle JIT-compilatori disponibili. Alcuni di questi compilatori potrebbe bloccarsi. Se lo fanno, voglio solo per eseguire continue;
e andare avanti con test di un altro compilatore.)
Attualmente, ho un'implementazione basata su signal()
che fallisce in modo orribile; naturalmente, è un comportamento indefinito a longjmp()
di un gestore di segnale e i gestori di segnale sono praticamente destinati a terminare con exit()
o terminate()
. Il solo lancio del codice in un'altra discussione non aiuta da solo, almeno per come l'ho provato finora. Non riesco anche a creare un modo per farlo funzionare usando le eccezioni C++.
Quindi, qual è il modo migliore per isolare un particolare set di istruzioni/thread/processo da arresti anomali?
Questo è l'unico modo per farlo. Un thread può danneggiare la memoria ovunque nel processo, quindi dopo un SEGV, non è possibile garantire che la memoria non sia influenzata. – KeithB
Grazie per l'heads-up. Quasi certamente la risposta giusta qui. Vado a leggere su fork() e compagnia. –