【发布时间】:2011-10-15 01:43:38
【问题描述】:
我正在尝试使用 POSIX 线程实现阻塞队列。重要的代码段如下所示。我试图运行这个程序。当队列中没有元素时,尝试从队列中删除元素的线程进入睡眠状态,并在没有来自将元素添加到队列中的线程的任何信号的情况下再次唤醒(我得出结论,因为我没有启动任何线程将一个元素添加到队列中)。再次唤醒的线程进入睡眠状态,并重复此过程。我究竟做错了什么?请有人告诉我我在这里缺少什么?
struct rqueue
{
int qsize;
int capacity;
pthread_mutex_t lock;
pthread_cond_t not_empty;
pthread_cond_t not_full;
};
删除元素方法:
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);
添加元素方法:
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);
【问题讨论】:
标签: c pthreads producer-consumer