【问题标题】:Interrupt or cancel a long computation in DLL中断或取消 DLL 中的长时间计算
【发布时间】:2020-06-23 16:04:51
【问题描述】:

我正在开发一个作为动态库 (DLL/so) 的 SDK。用户可以在运行计算之前设置很多参数。但我想提供一种动态更改参数的方法,它应该停止当前计算并使用新参数重新启动它。所以一般用法应该是这样的:

Client Caller thread -----> Call my SDK -----> Computation code
                                                      ^
                                                      |
                                                      |
Client UI Thread ----> Request cancelation ------------

我有很多关于机制的问题,我想知道这样做的好做法是什么。

1) 如何处理中断?

  • 我是否应该在异步线程中运行我的计算,然后只删除该线程的结果?
  • 我是否应该使用计算线程有时会检查以返回起点的std::atomic<bool>

2) 如果使用第二个选项,返回发射点的最佳方式是什么?

  • 在这种情况下可以使用 C++ 异常吗? (注意:我已经在计算代码中使用异常处理非常罕见的情况。)
  • 是否应该一直处理错误代码并进行早期检查以避免计算?
  • 可以使用longjmp 或类似的东西吗?

【问题讨论】:

    标签: c++ multithreading dll cancellation


    【解决方案1】:

    为了正确的对象清理和资源回收,您需要抛出异常或停止计算并让计算函数正常返回。

    您不应中止线程或使用longjmp,因为它们不会破坏您的计算创建的对象,从而导致内存泄漏和您可能正在使用的任何其他资源(如文件句柄)。

    使用您的计算定期轮询的std::atomic(可从任何地方轻松访问)是实现此目的的一种方法。您需要定期检查,因此检查需要在您拥有的任何循环中或附近。短而快速的循环在循环时不需要检查,但应该每秒至少进行几次检查。一旦检测到取消请求,您可以抛出异常,或者从当前函数返回(因此父函数也需要检查取消)。

    所有这一切的一个缺点是,如果您在某个地方错过了循环检查,您的取消可能不会立即发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多