我们有一个第三方库,编写时没有考虑多线程或异常处理.我们的主要可执行文件是多线程的并使用异常.
第三方库用于exit()中止程序以解决严重问题(例如"未初始化驱动程序"或"未找到文件").exit()不允许调用多线程应用程序,因为它不能正确关闭线程.另外,我真的不想退出主应用程序,因为它是一个服务器应用程序,并且在许多情况下,主程序可以采取主动的事情来从错误中恢复.
我想基本上exit(int status)用我自己的函数替换系统提供的函数,即
class exit_exception : public runtime_error
{
public: exit_exception(int status)
: runtime_error("exit called with status " + to_string(status)) {}
};
extern "C" void exit(int status) {
throw exit_exception(status);
}
Run Code Online (Sandbox Code Playgroud)
并在我的代码中捕获异常.它似乎有效,但这显然是一种黑客行为,而不是大自然打算exit()使用的方式.不知道我做错了什么?
许多人建议我把它放在一个单独的过程中,但这会打败很多东西.第三方库执行非常高速的数据传输,需要在主应用程序进程中,因为它位于相同的虚拟内存空间中,不用于malloc从作为控制器的FPGA协处理器分配内存.这段代码接近"铁",并且正在挤压内存和PCIe总线的每一点带宽.
我的程序仍可以返回状态代码与返回值的OS int main(),这并没有最终调用exit().否则我会遇到麻烦.