0

私は2つのスレッドを持つプロセスを持っています。2 つのスレッドの 1 つが彼の命令の実行を完了すると、もう 1 つのスレッドも停止するはずです。そして、プロセスは終了するはずです。スレッドの 1 つが命令の実行を完了したかどうかを確認する方法は? これは私がこれまでに書いたコードです。

#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;

}
4

2 に答える 2

1

グローバル フラグ変数を宣言して、最初に false に設定できます。スレッドが最後のステートメントに到達するたびに、フラグを true に設定します。そして、スレッドが実行を開始するたびに、最初にフラグ値をチェックします。それが false の場合、つまり他のスレッドが更新されていない場合は実行を継続し、それ以外の場合は関数から戻ります

于 2013-11-10T10:13:37.477 に答える
0

まず最初に、pthread_cancelマニュアル ページ (および関連するpthread_setcancelstatepthread_setcanceltype関数のマニュアル ページ) を読みたいと思うかもしれません。最初のリンクには良い例が含まれています。

別の解決策は、たとえば、スレッドが終了する必要があるかどうか、または別のスレッドが終了したかどうかを確認するためにスレッドが時々チェックするグローバル変数のセットを用意することです。

eg を使用する際の問題pthread_cancelは、自分自身の後に簡単にクリーンアップすることなくスレッドが終了することであり、これによりリソース リークが発生する可能性があります。pthread_key_createこれを克服する 1 つの方法についてお読みください。

于 2013-11-10T10:13:03.577 に答える