1

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

4

2 回答 2

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

于 2012-01-29T17:31:33.713 回答
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;
}
于 2012-01-27T15:40:56.783 回答