我有一个Boost线程池,用于执行某些任务。我也有一个具有纯虚函数doWork(int total) = 0;
的Sensor类。每当请求时,我的主进程都会获取必要的Sensor指针,并告诉线程池运行Sensor::doWork(int total)
。
threadpool->schedule(boost::bind(&Sensor::doWork,this,123456));
我正在动态加载Sensor类型的库,因此,如果其他人的编码错误导致SEGFAULTS等,则这是我无法控制的。那么,在我的主流程中,有没有办法处理
Sensor::doWork(int total)
引发的任何错误,清理线程,删除该传感器对象并通知控制台发生错误的位置和原因? 最佳答案
实际上,处理分段错误的唯一方法是在完全独立的进程中运行Sensor::doWork
。
在UNIX中,这涉及使用fork
(或其他类似方法),在子进程中运行Sensor::doWork
,然后以某种方式将结果传递回父进程。
我认为Windows中可以使用类似的方法。
编辑:我想我会充实一些您可以做的事情。
解决方案#1:您可以使用与线程相同的方式来处理进程。例如,您可以创建一个位于其中的循环的进程池。
并且由于您正在其他进程中执行任务,因此可以防止它们崩溃。这种解决方案的主要困难实际上是进程之间的通信。也许boost的进程间库将对此有所帮助。我主要在python中完成了此类工作,它具有一个标准的
multiprocessing
模块,可以为您处理这些事情。解决方案2:您可以将应用程序分为在不同进程中运行的“安全”和“风险”部分。 “风险”部分执行
Sensor::doWork
方法以及您在该过程中可能要执行的其他任何操作-但只有在崩溃时可以自然丢失的可接受的工作。 “安全”部分处理您无法承受的任何宝贵信息,并监视“风险”部分,并在 child 崩溃时执行一些恢复操作。而且,当然,您决定在安全方面要做的任何其他工作。关于c++ - 捕捉信号c++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8593136/