检查线程结束条件

时间:2013-11-10 09:59:28

标签: c linux multithreading

我有一个包含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;

}

2 个答案:

答案 0 :(得分:1)

您可以声明一个全局标志变量,并在最初将其设置为false。 每当线程到达其最后一个语句时,它将标志设置为true。每当线程开始执行时,它将首先检查标志值,如果它为false,即没有其他线程已更新,则继续执行,否则从函数返回

答案 1 :(得分:0)

首先,您可能需要阅读pthread_cancel手册页(以及相关pthread_setcancelstatepthread_setcanceltype功能的手册页)。第一个链接包含一个很好的例子。

另一种解决方案是线程不时检查的一组全局变量,以查看它们是否应退出或是否已退出其他线程。

使用例如的问题pthread_cancel是线程被终止而不会让你轻易地清理自己,这可能导致资源泄漏。阅读pthread_key_create关于解决此问题的一种方法。