2012-12-20 59 views
0

我想完成什麼:pthread_join不起作用

在主函數中創建了兩個線程。它們用數字5遞增一個全局變量。然後向消費者線程發送一個信號,遞減變量。在每次遞減之間的消費線程中顯示當前值。主線程必須等到所有線程完成並退出。

我得到什麼:消費者有機會來顯示結果之前

有些時候,主要功能退出。我正在使用pthread_join,但它返回錯誤代碼3.

任何想法如何獲得想要的結果?

該代碼是波紋管。

#include <pthread.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

static pthread_mutex_t mtx; 
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

void *producer(void *arg); 
void *consumer(void *arg); 
static int avail = 0; 

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

    pthread_t cons1, prod1, prod2; 

    int status; 
    int t1; 
    int t2; 
    int t3; 

    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 

    pthread_mutexattr_t mtxAttr; 
    pthread_mutexattr_settype(&mtxAttr, PTHREAD_MUTEX_ERRORCHECK); 
    pthread_mutex_init(&mtx, &mtxAttr); 

    t1 = pthread_create(&prod1, &attr, producer, NULL); 
    if(t1 != 0){ 
    perror("problem1"); 
    } 
    t2 = pthread_create(&prod2, &attr, producer, NULL); 
    if(t2 != 0){ 
    perror("problem2"); 
    } 
    t3 = pthread_create(&cons1, &attr, consumer, NULL); 
    if(t3 != 0){ 
    perror("problem3"); 
    } 

    status = pthread_join(t1, NULL); 
    if(status != 0){ 
    perror("can't join1"); 
    } 

    status = pthread_join(t2, NULL); 
    if(status != 0){ 
    perror("can't join2"); 
    printf("\n%d\n", status); 
    } 
    status = pthread_join(t3, NULL); 
    if(status != 0){ 
    printf("%s",strerror(errno)); 
    } 
    printf("\nend result \t%d\n",avail); 
    printf("fin\n"); 
    //while(1){} 
    return 0; 
} 

void *producer(void *arg){ 
    int s; 
    printf("producer\n"); 
    s = pthread_mutex_lock(&mtx); 
    avail+=5; 
    s = pthread_mutex_unlock(&mtx); 
    s = pthread_cond_signal(&cond); 
    pthread_exit(NULL); 
} 

void *consumer(void *arg){ 
    int s; 
    while(1) { 
    s = pthread_mutex_lock(&mtx); 
    if(s !=0){ 
     perror("lock err"); 
    } 
    while (avail == 0) { 
     s = pthread_cond_wait(&cond, &mtx); 
    } 
    while (avail > 0) { 
     avail--; 
     printf("Temp: %d \n",avail); 
    } 

    s = pthread_mutex_unlock(&mtx); 
    } 
    printf("done"); 
    pthread_exit(NULL); 
} 

回答

4

不要加入對t1t2t3。這些是pthread_create()函數的返回碼。改用prod1,prod2cons1代替pthread_join()。請用-Wall -Wextra進行編譯。

+0

謝謝!下次更好再小心一點。 – DimDqkov

+0

@DimDqkov不客氣 – ydroneaud