2011-10-15 92 views
0

我想用POSIX線程實現一個阻塞隊列。重要的代碼段如下所示。我試圖運行這個程序。嘗試從隊列中刪除元素的線程在隊列中沒有元素時會進入休眠狀態,並且在沒有任何信號從線程向隊列中添加元素的情況下再次喚醒(這是我得出的結論,因爲我沒有啓動任何線程將一個元素添加到隊列中)。線程再次醒來,然後重複這個過程。我究竟做錯了什麼?請有人告訴我我在這裏失蹤了什麼?我Posix線程沒有信號醒來

struct rqueue 
{ 
    int qsize; 
    int capacity; 
    pthread_mutex_t lock; 
    pthread_cond_t not_empty; 
    pthread_cond_t not_full; 
}; 

remove_element_method:

pthread_mutex_lock(&rq->lock); 

    while(rq->qsize == 0){ 
     perror("Q size is zero going to sleep"); 
     pthread_cond_wait(&rq->not_empty); 
     perror("woke up"); 
    } 

// some code 
    pthread_cond_signal(&rq->not_full); 
    pthread_mutex_unlock(&rq->lock); 

add_element_method:

pthread_mutex_lock(&rq->lock); 

    if(rq->capacity != -1){ 

     while(rq->qsize == rq->capacity){ 
     pthread_cond_wait(&rq->not_full); 
     } 
    } 

    //some code 

    pthread_cond_signal(&rq->not_empty); 
    pthread_mutex_unlock(&rq->lock); 

回答

0

pthread_cond_wait()的兩個參數 - 第二個是你持有的互斥。你只傳遞一個參數。

此外,您是否使用pthread_mutex_init()和pthread_cond_init()初始化互斥鎖和條件變量?

+1

此外,這種情況發生的頻率如何?如果很少見,這很正常 - 可能是[虛假喚醒](http://en.wikipedia.org/wiki/Spurious_wakeup)。 – uscjeremy

+0

非常感謝。我忘了第二個參數。它現在似乎在工作。但編譯器應該說沒有匹配的功能吧? – FourOfAKind

+1

如果編譯器接受缺少參數的代碼,那幾乎肯定意味着您(1)忘記包含'pthread.h',並且(2)禁用了所有警告。 –