Таймер ограничения времени выполнения в C - PullRequest
1 голос
/ 27 января 2012

Я хочу установить ограничение времени выполнения (в часах) для моего алгоритма на C, чтобы при достижении этого предела алгоритм останавливался (например, в 12 часов). У кого-нибудь есть предложения как это сделать?

Ответы [ 2 ]

1 голос
/ 29 января 2012

Поскольку это 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;
}

Это ожидает тайм-аут 5с и завершается в коде выше. Если вы хотите сделать что-то кроме выхода, вы можете, например, установить глобальное значение, чтобы указать, что алгоритм должен выйти (очевидно, будьте внимательны, если вы используете потоки).

1 голос
/ 27 января 2012

Вы можете использовать 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;
}
...