簡體   English   中英

線程終止條件

[英]Thread Termination Condition

我正在用C語言編寫一個生產者-消費者線程程序。程序中的所有內容都可以正常運行,但有一個主要例外。 當我有多個使用方線程(通常總是這樣)時,實際上只有第一個使用方線程會終止。 我已經嘗試了所有我能想到的一切,但是問題仍然存在。 這是我的代碼,其中刪除了部分內容,以便您僅能看到相關的部分。

從輸出中可以看到,兩個終止條件變量都變為零,這當然是第一個使用者線程終止的原因。 但是,為什么其他使用者線程也不會終止?

謝謝!

sem_t full, empty, mutex;
int threads;
int to_consume;
FILE* inputfp[5];
FILE* outputfp = NULL;
char in[BUF];

void* p(void* inpFile) {

    while (fscanf(inpFile, FMTSTRING, in) > 0) {
        sem_wait(&empty);
        sem_wait(&mutex);
        // production code here
        to_consume++;
        sem_post(&mutex);
        sem_post(&full);
     }

    fclose (inpFile);

    sem_wait(&mutex);
    threads--;
    sem_post(&mutex);

    return NULL;
}

void* c() {

    int continuing = 1;

    while (continuing) {

        sem_wait(&full);
        sem_wait(&mutex);
        //consumption code here
        to_consume--;
        fprintf("%d %d\n", threads, to_consume); //these both go to zero by the end

        if ( (threads <= 0) && (to_consume <= 0) ) {
            continuing = 0;
        }

        sem_post(&mutex);
        sem_post(&empty);
    }

    return NULL;
}

int main (int argc, char* argv[]) {

    int i;
    int con_threads;
    con_threads = 3;
    to_consume = 0;

    pthread_t *pr_thread[argc-2];
    pthread_t *con_thread[2];

    sem_init(&full, 0, 0);
    sem_init(&empty, 0, 50);
    sem_init(&mutex, 0, 1);

    for (i = 0; i < (argc-2); i++) {
        pr_thread[i] = (pthread_t *) malloc(sizeof(pthread_t)); 
        inputfp[i] = fopen(argv[i+1], "r");
        int rc = pthread_create (pr_thread[i], NULL, p, inputfp[i]);
        sem_wait(&mutex);
        threads++;
        sem_post(&mutex);
    }

    outputfp = fopen(argv[(argc-1)], "wb");

    for (i = 0; i con_threads 3; i++) {
        con_thread[i] = (pthread_t *) malloc(sizeof(pthread_t));
        int rc = pthread_create (con_thread[i], NULL, c, NULL);
    }

    for (i = 0; i < (argc - 2); i++) {
        pthread_join(*pr_thread[i], 0);
        free(pr_thread[i]);
    }

    for (i = 0; i con_threads 3; i++) {
        fprintf(stderr, "About to close consumer thread %d.\n", i);
        pthread_join(*res_thread[i], 0);
        fprintf(stderr, "Consumer thread %d closed successfully.\n", i);
        free(res_thread[i]);
    }

    printf ("About to close the output file.\n");
    /* Close the output file */
    fclose (outputfp);

    return EXIT_SUCCESS;
}

我認為您的問題是,當第一個使用方檢測到沒有剩余線程時,您不會再次發布full ,因此第二個使用方正在等待full但是信號永遠不會到達。 您可能需要消費者的計數,但對於第一次通過(概念驗證),你可以離開full與被從來沒有讀過一職。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM