C语言中的运行时限制计时器

C语言中的运行时限制计时器,c,timer,hour,C,Timer,Hour,我想在C语言中为我的算法设置一个运行时限制(以小时为单位),这样当它达到限制时,算法就会停止(例如,在12小时)。有人对此有什么建议吗?您可以使用time()获取开始时的时间以及算法中每次迭代的时间。您可以使用difftime()计算差值,并在超过某个值时终止算法 假设您的算法是迭代的,下面是一个在5秒后终止循环的示例代码 #include <stdio.h> #include <time.h> int main(int argc, char **argv) {

我想在C语言中为我的算法设置一个运行时限制(以小时为单位),这样当它达到限制时,算法就会停止(例如,在12小时)。有人对此有什么建议吗?

您可以使用
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;
}
#包括
#包括
int main(int argc,字符**argv)
{
时间不是开始时间;
时间不是现在;
时间(&开始时间);
而(1){
/*你的算法在这里*/
/*时间校验码*/
时间(现在和现在时间);
if(difftime(现在时间,开始时间)>=5){
打破
}
}
返回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;
}
#包括
#包括
#包括
void*algo(void*arg)
{
而(1){
printf(“我是算法!!\n”);
}
返回NULL;
}
int main(int argc,字符**argv)
{
时间不是开始时间;
时间不是现在;
pthread_t algo_线程;
int ret=pthread_create(&algo_-thread,NULL,algo,NULL);
时间(&开始时间);
/*时间检查循环*/
而(1){
时间(现在和现在时间);
if(difftime(现在时间,开始时间)>=5){
打破
}
}
返回0;
}

由于这是Linux,您可能会发现使用
alarm()
很方便(前提是您的算法不需要任何可能干扰的调用,例如
sleep()
)。然后可以使用
sigaction()
SIGALRM
注册处理程序。当警报响起时,你将处理信号,不管你如何处理超时。下面是一个您可以如何使用它的简单示例:

#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;
}
#包括
#包括
#包括
#包括
无效超时\u处理程序(int-signum){
fprintf(stderr,“超时(信号:%d)!\n”,signum);
出口(1);
}
内部主(空){
结构sigaction sa={0};
sa.sa_handler=超时_handler;
sigaction(SIGALRM,&sa,NULL);
警报(5);
对于(;);
返回0;
}

这将等待5秒超时,并在上面的代码中退出。如果您想执行退出以外的操作,例如,您可以设置一个全局值来指示算法应该退出(如果您使用的是线程,显然要注意)。

什么操作系统?您指的是墙时间还是CPU时间?此验证应该在程序内部进行,也可以在程序外部进行?操作系统是linux,验证可以在程序内部进行。程序返回“浮点异常”错误,计时器是否可能在数小时内工作?因为第二个计数器可能超过双精度类型。是的,如果您希望时间为12小时,只需使用
12*3600
作为秒数,而不是我的示例中的
5
。@近地点:双精度的最大值通常在1.7e308左右,您很快就不会有这样的运行时间。从字面上说,我想不出为什么你应该得到“浮点异常”。代码中唯一可疑的部分是
difftime()
调用。您可以尝试将
difftime(now\u time,start\u time)
替换为
now\u time-start\u time
,以查看它是否解决了问题。它可以在大多数实现中使用,因为时间通常是整数类型。您正在使用哪个操作系统和编译器的哪个版本?