gpt4 book ai didi

c++ - 捕捉信号 C++

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:18 25 4
gpt4 key购买 nike

我有一个 boost 线程池,用于执行某些任务。我还有一个具有纯虚函数 doWork(int total) = 0; 的 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 方法以及您可能希望在该过程中执行的任何其他操作——但仅执行在崩溃时自发丢失的可以接受的工作。 “安全”部分处理您不能丢失的任何宝贵信息,并监视“风险”部分,在子系统崩溃时执行一些恢复操作。当然,在安全的情况下,无论您决定要做什么其他工作。

关于c++ - 捕捉信号 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com