My Posix Thread wakes up without a signal
I'm trying to implement a blocking queue using POSIX threads. Important code segments are shown below. I tried to run this program. The thread trying to remove an element from the queue goes to sleep when there are no elements in the queue and wakes up again without any signal from the thread that adds an element into the queue (This I conclude because I did not start any thread that adds an element into the queue). The thread woke up again goes to sleep and this process repeats. What am I doing wrong? Please some one tell me what I am missing here? 

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


My Posix Thread wakes up without a signal
===

I'm trying to implement a blocking queue using POSIX threads. Important code segments are shown below. I tried to run this program. The thread trying to remove an element from the queue goes to sleep when there are no elements in the queue and wakes up again without any signal from the thread that adds an element into the queue (This I conclude because I did not start any thread that adds an element into the queue). The thread woke up again goes to sleep and this process repeats. What am I doing wrong? Please some one tell me what I am missing here? 

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

