Estoy trabajando en una biblioteca donde realizo diversas tareas en algunas bibliotecas de terceros que realizan trabajos poco detallados o peligrosos específicos de la plataforma. (Específicamente, estoy escribiendo un analizador sintáctico de funciones que llama a los compiladores JIT, como LLVM o libjit, para construir código de máquina.) En la práctica, estas bibliotecas de terceros tienden a ser un desastre (parte de esto es culpa mía , por supuesto, pero aún quiero un seguro).Cómo aislar un trabajo/subproceso de bloqueos
Me gustaría, entonces, poder tratar con gracia un trabajo que muere horriblemente - SIGSEGV, SIGILL, etc. - sin desglosar el resto de mi código (o el código de los usuarios que llaman a mi funciones de biblioteca). Para ser claro, no me importa si ese trabajo en particular puede continuar (no voy a tratar de reparar una condición de falla), ni me importa realmente el estado de los objetos después de un choque (lo descartaré). ellos inmediatamente si hay un choque). Solo quiero ser capaz de detectar que se ha producido un bloqueo, detener el bloqueo de todo el proceso, dejar de llamar a lo que sea que esté cayendo y reanudar la ejecución.
(Para un poco más de contexto, el código en este momento es un bucle for, probando cada uno de los compiladores JIT disponibles. Algunos de estos compiladores pueden fallar. Si lo hacen, solo quiero ejecutar continue;
y continuar con la prueba de otro compilador.)
Actualmente, tengo una implementación basada en signal()
que falla bastante horriblemente; por supuesto, es un comportamiento indefinido a longjmp()
de un manejador de señal, y se espera que los controladores de señal terminen con exit()
o terminate()
. Solo arrojar el código en otro hilo no ayuda por sí solo, al menos como lo he probado hasta ahora. Tampoco puedo hackear una forma de hacer que esto funcione usando excepciones de C++.
Entonces, ¿cuál es la mejor manera de aislar un conjunto particular de instrucciones/hilo/trabajo de fallas?
Esta es la única forma de hacerlo. Un hilo puede dañar la memoria en cualquier parte del proceso, por lo que después de un SEGV, no puede garantizar que su memoria no se vea afectada. – KeithB
Gracias por el aviso. Casi con certeza la respuesta correcta aquí. Me voy a leer en fork() y compañía. –