【问题标题】:Exit function after certain time in C++在 C++ 中的特定时间后退出函数
【发布时间】:2023-03-24 11:55:01
【问题描述】:

我有一个具有指数复杂度的函数(其内容不能修改):

void exponential_func(int depth){
  // recursively search a tree and extract best value
  return value;
}

这个函数被迭代调用

void call_exponential_function(int max_depth){
  for(int i = 1; i < max_depth; i++){
    cout << exponential_func(i) << endl;
  }
}

我想在一定的时间限制内进行最深入的搜索。例如,时间限制为 60 秒。对于 i=1 到 5,调用 exponential_func(i) 总共需要 30 秒。exponential_func(6) 需要 120 秒。时间到了如何停止call_exponential_function的执行?

【问题讨论】:

  • recursively search a tree and extract best value -> recursively search a tree and extract best value and also check if time limit is reached
  • 到哪里检查是否达到时间限制?
  • 可能就在每次通话的开头。然后你必须决定是返回一个代码来表示失败还是抛出一个异常。根据递归函数的复杂性,任何一个都可能更有吸引力。
  • 嗨,我编辑了问题以使其更清楚。在通话前检查时间不起作用,因为您不知道exponential_func 需要多长时间才能完成(只是需要更长的时间)。该函数需要在执行时停止。

标签: c++ time tree exit


【解决方案1】:

您将需要让exponential_func 在被告知这样做时合作退出,方法是在最后期限内传递。

如果实际上不可能修改该函数,那么您可以在单独的线程上运行它,并在截止日期结束时终止该线程。 但是,这可能会使exponential_func 正在使用的数据(可能包括堆等全局数据结构)处于损坏状态。所以这样做通常不是一个好习惯,我只是将它作为一个假设的想法提供。

因此,在这种情况下,更好的选择是生成另一个进程,该进程通过某种 IPC 接受数据,运行exponential_func,通过 IPC 检索结果,如果超过截止日期,则可以终止。如果我正在编写生产就绪的代码,我会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多