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

标签 c++ multithreading crash signals setjmp

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

然后,我希望能够非常优雅地处理一项可怕的死亡任务——SIGSEGV、SIGILL 等——而无需降低我的其余代码(或调用我的库的用户的代码)职能)。明确地说,我不关心那个特定的工作是否可以继续(我不会尝试修复崩溃情况),我也不真正关心这样的崩溃后对象的状态(我会丢弃如果发生崩溃,请立即通知他们)。我只是希望能够检测到发生了崩溃,阻止崩溃取消整个进程,停止调用崩溃的任何内容,然后恢复执行。

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

目前,我有一个基于 signal() 的实现,但它非常失败;当然,从信号处理程序中 longjmp() 是未定义的行为,并且信号处理程序很可能以 exit()terminate() 结束。仅仅将代码放在另一个线程中本身并没有帮助,至少到目前为止我测试它的方式是这样。我也无法找到一种使用 C++ 异常来完成这项工作的方法。

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

最佳答案

生成一个新进程。

关于c++ - 如何将作业/线程与崩溃隔离开来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557999/

相关文章:

c++ - 是否应该使用范围 for 循环而不是 vector 上的迭代器?

c# - 信号量停止我的线程

visual-studio - 在 Visual Studio 2010 中打开文件时崩溃

iOS CRASH 问题 - SIGSEGV

c++ - 在 C++ 中嵌入 matplotlib

c++ - 那是 C++ 编译器错误吗?

java - 为什么局部变量不允许使用 volatile 关键字?

java - java中从一个套接字线程向所有现有套接字线程广播数据

iphone - 当应用程序在 ipad 中运行 10 分钟时,错误 = 24

c++ - 带有 XULRunner 15 的 Linux 上的 XRE_InitEmbedding2 SIGSEGV