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