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)禁用了所有警告。 –