2015-08-24 51 views
-1

好的,下面的代碼中至少有兩個應該糾正的主要問題。互斥鎖中的條件變量錯誤

#define COUNT_LIMIT 12 
pthread_mutex_t c_mutex; 
pthread_cond_t cond_cv; 

int count=0; 

void *inc_count(void *param) 
{ 
    int i=0; 
    for (i=0;i<14;i++) { 
     count++; 
     if (count==COUNT_LIMIT) 
      pthread_cond_signal(&cond_cv); 
    } 
} 

void *watch_count(void *param) 
{ 
    pthread_mutex_lock(&c_mutex); 
    while (count<COUNT_LIMIT) { 
     pthread_cond_wait(&cond_cv, &c_mutex); 
     printf("watch_count(): signal received.\n"); 
    } 
    pthread_mutex_unlock(&c_mutex); 
    pthread_exit(NULL); 
} 

,我發現是在while循環的WATCH_COUNT部()函數的第一個問題,邏輯有錯誤的,因爲當計數爲12時,它也不會小於COU​​NT_LIMIT。因此,要解決這個問題我想將其更改爲

while(count <= COUNT_LIMIT) 

請問另一件事是信號WATCH_COUNT部後解鎖互斥()?

否則,我找不到任何其他錯誤的東西。我的活動嘗試閱讀this,但我很難理解它。

+0

'while'條件很好,因爲它是。 「當計數爲12時,不會小於COU​​NT_LIMIT」。這正是想要的。它應該保持循環,直到計數達到12爲止。您的更改不是必需的。 – kaylum

+0

我不認爲你的問題帶有*理想行爲的合理描述*? – WhozCraig

回答

1

一個錯誤是,inc_count()函數需要在訪問count變量時鎖定互斥鎖。

你的建議的while()循環的變化是不正確 - 它應該呼叫pthread_cond_wait()如果再次count == COUNT_LIMIT,所以原來的測試是正確的。

另一個錯誤可能是c_mutexcond_cv未正確初始化。