【问题标题】:C++: Time-out function from outside the functionC++:函数外的超时函数
【发布时间】:2020-05-05 07:33:02
【问题描述】:

我有一个执行可能非常慢的计算的函数(请参阅下面的基本示例)。该函数不写入现有资源,没有副作用,并且只对其所有变量使用自动分配(因此在标准库中的任何调用之外,永远不会调用 newdelete)。

是否可以在函数运行一定时间后使函数超时并释放它所请求的堆内存,不修改函数本身?

//Returns all primes up to n (fairly bad implementation; the idea is that it runs too long)
std::vector<int> primes(int n) {
    std::vector<int> list={2};
    for (int i = 3; i <= n; i++) {
        bool flag= 0;
        for (const auto& j : list) {
            if (i % j == 0) {
                flag= 1;
                break;
            }
        }
        if (!flag)
            list.push_back(i);
    }
    return list;
}

main 看起来像这样:

int main(){
std::vector<std::vector<int>> list_of_lists(6);
#pragma omp parallel for num_threads(6)
    for (int n = 1; n < 7; n++) {
       //I want the assignment below to make list_of_lists[n-1] empty if it takes more than 5 secs
        list_of_lists[n-1] = primes(n*100000);
    }
//use the list_of_lists
}

函数primes本身不能修改。

有一种方法可以使用std::async 从函数外部检查经过的时间,但不幸的是,没有办法在std::future 完成之前杀死它。所以我想知道最好的方法是什么。

【问题讨论】:

  • 不容易啊,为什么不能修改primes函数呢?还有这必须在什么操作系统上运行,还是学术练习?
  • C++ 不提供任何此类功能,因此std::async 不会帮助您。还尝试坚持使用 OpenMP 或 C++11 线程结构。将两者混合可能不是一个好主意。如果您真的需要这样做,您可能需要使用一些特定于操作系统的 API。
  • @gct 实际上,primes 函数是另一个调用其他函数的函数……有许多不可预知的点,这些函数中的任何一个都可能减慢速度,因此到处进行检查并传递超时变量这将是一项艰巨的任务。操作系统是 Windows 和 Linux。
  • 是的,在 C++ 中抢占通用函数并不容易。可以这样想:内联这些函数可能在运行时根本不存在all,那么你会抢占什么?跨平台做会更难。
  • 不幸的是,c++ 中还没有标准化的进程管理。生成一个进程可能有点更昂贵,但我认为它通常会接近生成一个线程,至少对于 Linux,我对 Windows 不是很熟悉。

标签: c++ multithreading asynchronous timeout cancellation


【解决方案1】:

如果没有注意到功能,任何形式的“终止”都是有风险的。 您可以做的最好的事情是有一个循环,它会定期检查函数外部可见的“终止”标志并退出,或者测量函数内经过的时间。

for(;;)
{
    if (bExit)
       break;

    // calculations here
}

不好的方法是在一个线程内运行函数,经过一段时间后终止。

【讨论】:

  • 这没有回答问题。函数不得修改。
  • @Maverobot 那么你没有任何安全的选择,只能杀死一个运行该函数的线程。这个方法不好
【解决方案2】:

没有办法知道何时安全,以及如何在函数运行时修复程序的可修改状态。

函数可以分配资源,甚至是内部程序资源。为此,它需要修改全局数据结构,而这些修改可能不是原子的,如果它们是原子的,也不会被正确地反转。

你需要一些合作。

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 2017-09-25
    • 1970-01-01
    • 2018-07-31
    • 2012-06-18
    • 1970-01-01
    • 2018-11-14
    • 2020-06-09
    • 2016-04-28
    相关资源
    最近更新 更多