如何将作业/线程与崩溃隔离开来

Cha*_*nce 6 c++ crash multithreading signals longjmp

我正在建立一个图书馆,在那里我将各种任务培养到一些第三方图书馆,这些图书馆做了一些相对粗略或危险的平台特定工作.(具体来说,我正在编写一个数学函数解析器,它调用JIT编译器,如LLVM或libjit,来构建机器代码.)实际上,这些第三方库有崩溃的倾向(部分原因是我的错当然,但我仍然需要一些保险).

那么,我希望能够非常优雅地处理可怕的工作 - SIGSEGV,SIGILL等 - 而不会删除我的其余代码(或用户调用我的库函数的代码).要明确的是,我不在乎这个特定的工作是否可以继续(我不打算尝试修复碰撞情况),也不关心碰撞后的物体状态(我会丢弃)如果发生碰撞,他们会马上出现.)我只是希望能够检测到发生了崩溃,阻止崩溃取出整个进程,停止调用崩溃的任何内容,然后继续执行.

(对于更多的上下文,目前的代码是for循环,测试每个可用的JIT编译器.其中一些编译器可能会崩溃.如果他们这样做,我只想执行continue;并继续测试另一个编译器. )

目前,我有一个signal()基于实现的实现失败了很多; 当然,它是一个未定义的行为,longjmp()从信号处理程序,信号处理程序几乎预计以exit()或结束terminate().只是将代码抛入另一个线程本身并没有帮助,至少我到目前为止测试它的方式.我也无法使用C++异常来解决这个问题.

那么,什么是将特定指令/线程/作业与崩溃隔离的最佳方法是什么?

ale*_*lex 11

产生一个新的过程.


mor*_*lli 5

当工作成功时,您收集什么输出?

我问,因为如果输出带宽很低,我很想在自己的进程中运行每个作业.

您启动的这些崩溃工作中的每一个都很有可能破坏您的流程中其他地方使用的内存.

流程提供最佳保护.