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);
此外,這種情況發生的頻率如何?如果很少見,這很正常 - 可能是[虛假喚醒](http://en.wikipedia.org/wiki/Spurious_wakeup)。 – uscjeremy
非常感謝。我忘了第二個參數。它現在似乎在工作。但編譯器應該說沒有匹配的功能吧? – FourOfAKind
如果編譯器接受缺少參數的代碼,那幾乎肯定意味着您(1)忘記包含'pthread.h',並且(2)禁用了所有警告。 –