我正在尝试使用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 :(得分:0)
pthread_cond_wait()接受两个参数 - 第二个是您持有的互斥锁。你只传递了一个论点。
另外,您是否使用pthread_mutex_init()和pthread_cond_init()初始化互斥锁和条件变量?