C 我的Posix线程在没有信号的情况下被唤醒

C 我的Posix线程在没有信号的情况下被唤醒,c,pthreads,producer-consumer,C,Pthreads,Producer Consumer,我正在尝试使用POSIX线程实现阻塞队列。重要的代码段如下所示。我试着运行这个程序。当队列中没有任何元素时,试图从队列中删除元素的线程进入睡眠状态,然后在没有任何来自将元素添加到队列中的线程的信号的情况下再次醒来。我总结说,这是因为我没有启动任何将元素添加到队列中的线程。线程再次被唤醒,进入睡眠状态,此过程重复。我做错了什么?请有人告诉我我错过了什么 struct rqueue { int qsize; int capacity; pthread_mutex_t lock; pt

我正在尝试使用POSIX线程实现阻塞队列。重要的代码段如下所示。我试着运行这个程序。当队列中没有任何元素时,试图从队列中删除元素的线程进入睡眠状态,然后在没有任何来自将元素添加到队列中的线程的信号的情况下再次醒来。我总结说,这是因为我没有启动任何将元素添加到队列中的线程。线程再次被唤醒,进入睡眠状态,此过程重复。我做错了什么?请有人告诉我我错过了什么

struct rqueue
{
  int qsize;
  int capacity;
  pthread_mutex_t lock;
  pthread_cond_t not_empty;
  pthread_cond_t not_full;
 };
删除元素\u方法:

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);
添加元素方法:

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);

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


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

此外,这种情况发生的频率有多高?如果是罕见的,这是正常的-可能是。非常感谢。我忘了第二个论点。它现在似乎起作用了。但是编译器应该说没有匹配的函数,对吗?如果编译器接受了缺少参数的代码,这几乎肯定意味着1忘记了包含pthread.h,2禁用了所有警告。