我的Posix线程在没有信号的情况下醒来

时间:2011-10-15 01:43:38

标签: c pthreads producer-consumer

我正在尝试使用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);

1 个答案:

答案 0 :(得分:0)

pthread_cond_wait()接受两个参数 - 第二个是您持有的互斥锁。你只传递了一个论点。

另外,您是否使用pthread_mutex_init()和pthread_cond_init()初始化互斥锁和条件变量?