C中的运行时限制计时器

时间:2012-01-27 15:36:33

标签: c timer hour

我想在C中为我的算法设置运行时限制(以小时为单位),这样当它达到限制时,算法就会停止(例如,12小时)。有没有人有任何建议怎么做?

2 个答案:

答案 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())。然后,您可以使用SIGALRMsigaction()注册处理程序。当闹钟弹出时,您将处理信号但是处理超时。以下是您可以使用它的最小示例:

#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时间超时并退出上面的代码。如果你想做除退出之外的其他事情,你可以设置一个全局值来表明算法应该退出(如果你使用线程,显然要注意)。