2013-11-10 4 views
0

У меня есть процесс с 2 потоками. если один из 2-х потоков выполнен с выполнением его инструкций, другой должен остановиться. И процесс должен закончиться. Как проверить, выполнил ли один из потоков выполнение инструкций? Это код, который я написал до сих пор.Проверить состояние окончания резьбы

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

int read = 0; 
int timeLeft = 0; 

void *readFromFile(void *myFile){ 
char *theFile; 
theFile = (char*) myFile; 
char question[100]; 
char answer[100]; 
FILE *file = fopen(theFile, "r"); 
if(file != NULL){ 
    while(fgets(question,sizeof question,file) != NULL){ 
     fputs(question, stdout); 
     scanf("%s", &answer); 
    } 
    read = 1; 
    fclose(file); 
    printf("Done with questions!\n"); 
    pthread_exit(
} 
else{ 
    perror(theFile); 
} 
} 

void displayTimeLeft(void *arg){ 
int *time; 
time = (int*) arg; 
int i; 
for(i = time; i >= 0; i -= 60){ 
    if(i/60 != 0){ 
     printf("You have %d %s left.\n", i/60,(i/60>1)?"minutes":"minute"); 
     sleep(60); 
    } 
    else{ 
     timeLeft = 1; 
     printf("The time is over \n"); 
     break; 
    } 
} 
} 


int main(){ 

pthread_t thread1; 
pthread_t thread2; 
char *file = "/home/osystems01/laura/test"; 
int *time = 180; 
int ret1; 
int ret2; 
ret1 = pthread_create(&thread1, NULL, readFromFile,&file); 
ret2 = pthread_create(&thread2, NULL, displayTimeLeft,&time); 


printf("Main function after pthread_create"); 



while(1){ 
      //pthread_join(thread1,NULL); 
      //pthread_join(thread2,NULL); 


    if(read == 1){ 

     pthread_cancel(thread2); 
     pthread_cancel(thread1); 
     break; 
    } 
    else if(timeLeft == 0){ 

     pthread_cancel(thread1); 
     pthread_cancel(thread2); 
     break; 
    } 

}  
printf("After the while loop!\n"); 
return 0; 

} 

ответ

0

Прежде всего, вы можете прочитать на странице pthread_cancel вручную (и страницы справочника для ассоциированных pthread_setcancelstate и pthread_setcanceltype функций). Первая ссылка содержит хороший пример.

Другое решение должно иметь, например, набор глобальных переменных, которые потоки время от времени проверяют, должны ли они выйти или выйдет другой поток.

Проблема с использованием, например, pthread_cancel - это то, что поток прекращается, не позволяя вам очищаться после себя легко, что может привести к утечке ресурсов. Читайте о pthread_key_create об одном способе преодоления этого.

1

Вы можете объявить глобальную переменную флага и сначала установить ее в false. Всякий раз, когда поток достигает своего последнего утверждения, он устанавливает флаг в true. И всякий раз, когда поток запускает выполнение, он сначала проверяет значение флага, если он неверен, то есть ни один другой поток не обновил его. Продолжение выполнения else возвращает из функции

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