Załóżmy, że moja funkcja główna wywołuje funkcję zewnętrzną VERSLOW ()

int main(){... veryslow();..}

Teraz chciałbym część inwokacji Very_slow w Main, dzięki czemu Verysslow kończy się, jeśli skończy się poza granicami czasu. Coś takiego

int main(){... call_with_timeout(veryslow, 0.1);...}

Jaki jest prosty sposób na to? Mój system operacyjny jest ubuntu 16.04.

0
zell 5 czerwiec 2018, 06:16

2 odpowiedzi

Najlepsza odpowiedź

Możesz zadzwonić do tej funkcji w nowym wątku i ustaw limit czasu, aby zakończyć wątek, zakończy to połączenie funkcji.

Przykład POSIX byłby:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>

pthread_t tid;

// Your very slow function, it will finish running after 5 seconds, and print Exit message.
// But if we terminate the thread in 3 seconds, Exit message will not print.
void * veryslow(void *arg)
{
    fprintf(stdout, "Enter veryslow...\n");
    sleep(5);
    fprintf(stdout, "Exit veryslow...\n");

    return nullptr;
}

void alarm_handler(int a)
{
    fprintf(stdout, "Enter alarm_handler...\n");
    pthread_cancel(tid);    // terminate thread
}

int main()
{
    pthread_create(&tid, nullptr, veryslow, nullptr);

    signal(SIGALRM, alarm_handler);
    alarm(3);   // Run alarm_handler after 3 seconds, and terminate thread in it

    pthread_join(tid, nullptr); // Wait for thread finish

    return 0;
}
1
zhm 5 czerwiec 2018, 07:14

Przeszedłem wskaźnik do interfejsu do funkcji i poprosić o jeden z powrotem. Dzięki temu umożliwiłem dwukrotną komunikację do wykonania wszystkich niezbędnych zadań - w tym limitowanie i powiadomienie limitowe.

0
Rebeka Fox 5 czerwiec 2018, 03:34