如何在指定的时间内运行程序
How to run a program for a specified amount of time?
对于计算密集型问题,我想限制程序花费的CPU时间:如果程序在给定的时间内找不到解决方案,我希望程序终止。与其让程序永远寻找解决方案,不如在一无所获的情况下终止。如果平台有问题,这是针对UNIX的。如何做到这一点?
另一个单线程且自包含的POSIX解决方案是使用信号:
#include <unistd.h>
#include <csignal>
std::sig_atomic_t volatile done = 0;
void game_over(int) { done = 1; }
int main()
{
std::signal(SIGALRM, game_over);
alarm(5); // this program will self-destruct in 5 seconds
while (!done)
{
do_my_thing(); // or whatever; make sure this returns frequently
}
}
(这是volatile
为数不多的合法和关键用途之一:我们必须防止编译器优化while (!done)
条件,并且编译器看不到done
可以变异,因为它在循环体内部从未被触及。)
POSIX不鼓励使用std::signal
,而支持其自身更强大的sigaction
。如果你感兴趣,请参阅手册,但为了发出警报的简单目的,这个解决方案似乎就足够了。
如果您的程序根本不提供中断点(即您可以检查done
的点),那么您也可以在信号处理程序中调用abort()
。
一种可能的方法是设置所需时间的进程限制。使用setrlimit()
设置的UNIX限制由运行时环境观察,并且它们同时支持软限制和硬限制。当达到软限制时,触发信号,该信号可以用于例如设置指示程序应该结束的标志。当达到硬限制时,应该终止程序(尽管这似乎在MacOS上不起作用)。下面是一个简单的示例程序:
#include <sys/resource.h>
#include <iostream>
#include <signal.h>
sig_atomic_t finished = false;
void limit(int)
{
finished = true;
}
int main()
{
signal(SIGXCPU, limit);
struct rlimit limit;
limit.rlim_cur = 2;
limit.rlim_max = 3;
setrlimit(RLIMIT_CPU, &limit);
unsigned long long i(0);
while (++i && !finished)
{
}
std::cout << "i=" << i << " flag=" << std::boolalpha << bool(finished) << "n";
}
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- KMP算法和LPS表构造的运行时间
- 如何计算Big-O表示法中的平均渐近运行时间
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 如何在长时间运行的方法中等待信号?
- 如何计划在将来时间运行的操作
- Lambda 捕获此函数和长时间运行的函数
- 如何使用媒体基础在给定时间运行/启动线程
- 对于长时间运行的程序,STL 内存管理是否"reliable"?
- 长时间运行的脚本的 symfony 执行
- C++linux应用程序在长时间运行后停止系统.如何找到原因
- c ++中是否有任何内置功能可以在计划的时间运行任务
- C++给定的日期和时间运行函数
- C/C++-模拟长时间运行
- 如何终止长时间运行的Qt线程
- 如何为长时间运行的程序执行文件输出
- 在指定时间运行c++循环
- 在精确的时间运行代码,每小时运行一次
- 用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本
- 如何在QThread中正确处理来自长时间运行的任务的信号和事件