【发布时间】:2011-04-03 05:56:43
【问题描述】:
我正在开发一个库,我将各种任务交给一些第三方库,这些库执行一些相对粗略或危险的特定于平台的工作。 (具体来说,我正在编写一个数学函数解析器,它调用 JIT 编译器,如 LLVM 或 libjit,以构建机器代码。)在实践中,这些第三方库有崩溃的趋势(部分原因是我的错,当然,但我仍然想要一些保险)。
然后,我希望能够非常优雅地处理一项可怕的工作——SIGSEGV、SIGILL 等——而不会关闭我的其余代码(或调用我的库的用户的代码)职能)。需要明确的是,我不关心该特定工作是否可以继续(我不会尝试修复崩溃条件),我也不真正关心此类崩溃后对象的状态(我会丢弃如果发生崩溃,请立即使用它们)。我只想能够检测到发生了崩溃,阻止崩溃退出整个进程,停止调用任何崩溃的内容,并恢复执行。
(对于更多的上下文,此刻的代码是一个 for 循环,测试每个可用的 JIT 编译器。其中一些编译器可能会崩溃。如果他们这样做,我只想执行 continue; 并获取继续测试另一个编译器。)
目前,我有一个基于signal() 的实现非常糟糕地失败了;当然,longjmp() 超出信号处理程序是未定义的行为,并且信号处理程序很可能以exit() 或terminate() 结尾。只是将代码扔到另一个线程中本身并没有帮助,至少到目前为止我测试它的方式是这样。我也无法找到使用 C++ 异常来完成这项工作的方法。
那么,使一组特定指令/线程/作业免受崩溃影响的最佳方法是什么?
【问题讨论】:
标签: c++ multithreading crash signals setjmp