我有一个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/

    10-11 18:55