我想在C中为我的算法设置运行时限制(以小时为单位),这样当它达到限制时,算法就会停止(例如,12小时)。有没有人有任何建议怎么做?
答案 0 :(得分:1)
您可以使用time()
来获取算法开始时的时间和每次迭代的时间。您可以使用difftime()
来计算差异,并在算法超过某个值时终止算法。
假设您的算法是迭代的,这是一个示例代码,在5秒后终止循环。
#include <stdio.h>
#include <time.h>
int main(int argc, char **argv)
{
time_t start_time;
time_t now_time;
time(&start_time);
while (1) {
/* Your algorithm goes here */
/* Time check code */
time(&now_time);
if (difftime(now_time, start_time) >= 5) {
break;
}
}
return 0;
}
这是一个非常简单的解决方案,适用于许多情况,您知道在执行算法期间经常会调用您的时间检查代码。如果您无法找到一个可以放置时间检查代码的好位置,以便在执行算法时经常调用它,则另一种方法是在线程中运行算法并在超出限制时终止它。
#include <stdio.h>
#include <time.h>
#include <pthread.h>
void *algo(void *arg)
{
while (1) {
printf("I AM THE ALGO!!\n");
}
return NULL;
}
int main(int argc, char **argv)
{
time_t start_time;
time_t now_time;
pthread_t algo_thread;
int ret = pthread_create(&algo_thread, NULL, algo, NULL);
time(&start_time);
/* Time check loop */
while (1) {
time(&now_time);
if (difftime(now_time, start_time) >= 5) {
break;
}
}
return 0;
}
答案 1 :(得分:1)
由于这是Linux,您可能会发现使用alarm()
很方便(前提是您的算法不需要任何可能会干扰的调用,例如sleep()
)。然后,您可以使用SIGALRM
为sigaction()
注册处理程序。当闹钟弹出时,您将处理信号但是处理超时。以下是您可以使用它的最小示例:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void timeout_handler (int signum) {
fprintf(stderr, "Timed out (signal:%d)!\n", signum);
exit(1);
}
int main (void) {
struct sigaction sa = { 0 };
sa.sa_handler = timeout_handler;
sigaction(SIGALRM, &sa, NULL);
alarm(5);
for (;;);
return 0;
}
等待5s时间超时并退出上面的代码。如果你想做除退出之外的其他事情,你可以设置一个全局值来表明算法应该退出(如果你使用线程,显然要注意)。