用于第三方lib调用的c ++看门狗

时间:2016-09-07 06:55:18

标签: c++ multithreading

我在线程进程环境中长时间运行boost::regex_match(...)调用时遇到问题。但它可能是另一个具有相同问题的lib(API调用)。

是否有通用的方法为此设置监视程序?

对于非线程进程alarm()可用于检测超时。 但是,信号线程不能很好地协同工作。我可以避免在线程中直接使用alarm()并委托计时器mgt。到一个专用的单独线程,让那个使用pthread_kill(...)来解决正确的线程(这只是一个想法 - 我还没有验证那部分)。

但是,这也只会中断并检测到这种情况,但无法正常停止 boost::regex_match(...)。 我使用sigsetjmp()使用siglongjmp()boost::regex_match(..)使用boost::regex_match(...) because进行线程。 但它会导致longjmp() siglongjmp()中的内存泄漏绕过析构函数。

如何优雅地停止第三方API调用 - 假设它已实现异常安全

或者它是否必须得到第三方API中积极实施的某些“可停止”功能的支持? (是否有一些用于升级库?)

也许有些奇怪的想法,但是:

代码可以实现为“线程安全”和/或“异常安全”。 是否可以选择定义“longjmp-safe”?这可以通过将附加令牌传递给lib来完成,以便将所有资源分配与该令牌相关联。在<head>之后,客户端SW可以单独请求API释放这些资源。

更简单可能只是一些中心的init()/ release()或register()/ unregister()API调用,API可以通过它来清理自己。

1 个答案:

答案 0 :(得分:0)

如果您必须:

  1. 监视超出执行时间
  2. 停止执行处理
  3. 你应该只考虑任务而不是线程。

    使用线程听起来像是#34;最先进的&#34;但在实践中,任务通常是更好的实施方式。特别是对于控制记忆韭菜&#34; undefined&#34;执行结束,限制不必要的内存过量并控制堆栈溢出等。

    在你提到的情况下,我倾向于将其作为任务来实现。 IPC在所有已知平台上运行良好,但不可移植。如果可移植性没有问题,那么更改为基于任务的解决方案并不是什么大问题。

    挂起任务可以通过os调用终止,并且所有锁,内存和其他资源(如ipc / shared memory / pipes等)将自动删除。因此,这更适合您的问题,并且它不依赖于您的外部和可能不可更改的第三方组件。