2016-12-16 75 views
0

我正在編碼以模擬售票情況:
兩個線程一個接一個地出售一些門票,一個線程在門票數爲0時顯示sold out
所以我嘗試使用一個條件變量。下面是代碼:
爲什麼pthread條件變量不起作用

int a = 10; 
pthread_mutex_t mtx; 
pthread_cond_t cond; 


void * funca(void *p) 
{ 
    while(1) 
    { 
     pthread_mutex_lock(&mtx); 
     if (a == 0) 
     { 
      break; 
     } 
     a--; 
     pthread_mutex_unlock(&mtx); 
     sleep(1); 
    } 
    pthread_mutex_unlock(&mtx); 
    pthread_cond_broadcast(&cond); 
    return NULL; 
} 

void * funcb(void *p) 
{ 
    while(1) 
    { 
     pthread_mutex_lock(&mtx); 
     if (a == 0) 
     { 
      break; 
     } 
     a--; 
     pthread_mutex_unlock(&mtx); 
     sleep(1); 
    } 
    pthread_mutex_unlock(&mtx); 
    pthread_cond_broadcast(&cond); 
    return NULL; 
} 

void * funcc(void *p) 
{ 
    pthread_mutex_lock(&mtx); 
    while(a != 0) 
    { 
      pthread_cond_wait(&cond, &mtx); 
      printf("I'm nothing"); 
    } 
    pthread_mutex_unlock(&mtx); 
    printf("sold out\n"); 
    return NULL; 
} 

然而,當我執行上面的代碼,我得到了許多I'm nothing一個無限循環打印。

+1

您尚未初始化您的互斥鎖和條件變量。當你聲明變量時,使用'pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;'和'pthread_cond_t cond = PTHREAD_COND_INITIALIZER;'。 (對於'funca()'和'funcb()'也沒有兩個相同的函數,你可以讓兩個不同的線程執行相同的函數)。 – caf

+0

@caf你能寫一個我能接受的答案嗎? – Yves

回答

3

您還沒有初始化您的互斥鎖和條件變量。當你聲明的變量,使用:

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

還有具有funca()funcb()兩個相同的功能是沒有意義的,你可以有兩個不同的線程執行相同的功能。

相關問題