C++:函数外部的超时功能
C++: Time-out function from outside the function
我有一个函数可以执行可能非常慢的计算(有关基本示例,请参见下文(。该函数不写入现有资源,没有副作用,并且仅对其所有变量使用自动分配(因此,在标准库内的任何调用之外,永远不会调用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
}
不好的方法是在经过一段时间后终止的线程中运行函数。
严格来说,没有办法知道什么时候是安全的,以及如何在函数运行时修复程序的可修改状态。
函数可以分配资源,甚至是内部程序资源。为此,它需要修改全局数据结构,这些修改可能不是原子的,如果是,也不会被正确逆转。
你需要一些合作。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- C++:函数外部的超时功能
- 是否可以处理超时的阻塞读取功能?
- 串口读取功能的通信超时和线程不超时
- 如何设置超时以在C套接字上"connect()"功能?
- 包括ping超时功能