2015-10-18 3 views
0

Следующая программа реализует два массива потоков. Есть две функции потока ученик и учитель (я их здесь не показывал). Моя примерная программа приведена ниже. Я хочу сделать ограничение по времени (скажем, 10 секунд), после чего основной поток автоматически выйдет независимо от того, завершились ли другие потоки или нет. Я также хочу, чтобы текущее время каждый момент после запуска программы. Как я это сделаю?Создание автоматической завершающей основной функции

Пример фрагмента кода:

int main(void) 
{ 
    pthread_t thread1[25]; 
    pthread_t thread2[6]; 
    int i; 
    int id1[25]; //for students 
    int id2[6]; //for teachers 

    for(i=0;i<25;i++) 
    { 
      id1[i]=i; 
      id2[i]=i; 
      pthread_create(&thread1[i],NULL,student,(void*)&id1[i]); 

      if(i<6) 
      { 
      pthread_create(&thread2[i],NULL,teacher,(void*)&id2[i]); 
      } 
    } 



    for (i=0;i<25;i++) 
    { 
    pthread_join(thread1[i],NULL); 
    if(i<6) 
    { 
     pthread_join(thread2[i],NULL); 
    } 
    } 

    return 0; 
} 

Какие дополнительные вещи я должен добавить в коде выше, чтобы прекратить основной поток через определенное время? (скажем: 10 секунд)

+0

Если процесс завершается, все (без отсоединения) потоки также будут убиты. Так что вам нужен таймер. –

+0

Как установить таймер? Можете ли вы показать мне демо-код? @Joachim Pileborg – user3114849

ответ

2

pthread_timedjoin_np() для этой передачи timespec struct. Вы можете установить тайм-аут-структуру после 10 секунд, как это:

struct timespec tp; 
tp.tv_sec = 10; 
tp.tv_nsec = 0; 

Затем вы измените ваши звонки присоединиться pthread_timedjoin_np(myThread, &tp). Что касается способа получения текущего времени, самым простым методом является использование функции gettimeofday.

Другой, возможно, более простой подход - использовать будильник. У вас может быть функция, которая выйдет из приложения. Таким образом, вы сделали бы что-то вроде этого:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/time.h> 

void alarmhandler(int sig) { 
    printf("Ten seconds passed, quitting!\n"); 
    exit(0); 
} 

int main() { 
    int i, j; 
    struct timeval end, start; 
    signal(SIGALRM, alarmhandler); 
    alarm(4); 
    gettimeofday(&start, NULL); 
    sleep(3); // simulate thread work 
    gettimeofday(&end, NULL); 
    long elapsed = (end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec; 
    printf("%f seconds elapsed!\n", (float)(elapsed)/1000000.0f); 
    for(;;); // block indefinitely 
} 
+0

Вам не нужно ждать завершения всех потоков, только первый. – Linus

+0

Что такое tp.tv_sec и tp.tv_nsec? что они означают? @Linus – user3114849

+0

@ user3114849 См. [Это] (http://man7.org/linux/man-pages/man3/pthread_tryjoin_np.3.html) руководство. Но, возможно, использование сигнала тревоги было бы проще для вас. – Linus

Смежные вопросы