【发布时间】:2020-05-05 07:33:02
【问题描述】:
我有一个执行可能非常慢的计算的函数(请参阅下面的基本示例)。该函数不写入现有资源,没有副作用,并且只对其所有变量使用自动分配(因此在标准库中的任何调用之外,永远不会调用 new 和 delete)。
是否可以在函数运行一定时间后使函数超时并释放它所请求的堆内存,不修改函数本身?
//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