c++ - C++:函数外的超时函数
问题描述
我有一个执行可能非常慢的计算的函数(参见下面的基本示例)。该函数不写入现有资源,没有副作用,并且仅对其所有变量使用自动分配(因此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
在它完成之前杀死它。所以我想知道最好的方法是什么。
解决方案
如果没有注意到功能,任何形式的“终止”都是有风险的。您可以做的最好的事情是有一个循环,它定期检查函数外部可见的“终止”标志并退出,或者测量函数内经过的时间。
for(;;)
{
if (bExit)
break;
// calculations here
}
不好的方法是在经过一段时间后终止的线程内运行函数。
推荐阅读
- linux - 在 AWS 的 linux 中的两个卷之间复制文件(db)的最快方法是什么?
- azure - Webjob 不使用 appsettings.env.json
- kubernetes - kubernetes 服务帐号权限
- python - 使用 LSTM 和 TimeseriesGenerator 进行多变量、多步时间序列预测
- spring-data-jpa - Kotlin Exposed 可以与 Spring Data JPA 集成吗?
- wordpress - JWT 令牌认证(从 Boostnote 发布到 Wordpress)
- react-native - React Native StyleSheet global.js 变量样式错误
- java - Undertow Core HTTPS 服务器给出 400 Bad Request
- c# - Visual Studio 2019 合并更改为未修改
- javascript - 无法读取 TS 中未定义的属性“创建”