Мой поток Posix просыпается без сигнала

#c #pthreads #producer-consumer

#c #pthreads #производитель-потребитель

Вопрос:

Я пытаюсь реализовать очередь блокировки с использованием потоков 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(amp;rq->lock);

  while(rq->qsize == 0){
      perror("Q size is zero going to sleep");
      pthread_cond_wait(amp;rq->not_empty);
      perror("woke up");
  }

// some code
  pthread_cond_signal(amp;rq->not_full);
  pthread_mutex_unlock(amp;rq->lock);
  

add_element_method:

 pthread_mutex_lock(amp;rq->lock);

  if(rq->capacity != -1 ){

      while(rq->qsize == rq->capacity){
        pthread_cond_wait(amp;rq->not_full);
      }
  }

  //some code

  pthread_cond_signal(amp;rq->not_empty);
  pthread_mutex_unlock(amp;rq->lock);
  

Ответ №1:

pthread_cond_wait() принимает два аргумента — второй — это мьютекс, который вы удерживаете. Вы передаете ему только один аргумент.

Кроме того, вы инициализировали переменные мьютекса и условия с помощью pthread_mutex_init() и pthread_cond_init()?

Комментарии:

1. Кроме того, как часто это происходит? Если это редко, это нормально — это может быть ложное пробуждение .

2. Большое спасибо. Я забыл второй аргумент. Кажется, сейчас он работает. Но компилятор должен сказать, что нет соответствующей функции, верно?

3. Если компилятор принял ваш код с отсутствующим аргументом, это почти наверняка означает, что вы (1) забыли включить pthread.h и (2) отключили все предупреждения.