тупик производитель-потребитель - PullRequest
0 голосов
/ 04 ноября 2010

Я написал следующий код:

void *produce(void* arg)
{
 buffer* buff = (buffer *) arg;
 while (1)
 {
  pthread_mutex_lock(&mutex);
  if (elements_produced == JOB_SIZE)
  {
   pthread_mutex_unlock(&mutex);
   pthread_exit(NULL);
  }
  elements_produced++;

  while (buff->in_buff == CAPACITY)
  {
   pthread_cond_wait(&cond_empty, &mutex);
  }

  // produce
  buff->buffer[buff->tail] = rand();
  sum_produced += buff->buffer[buff->tail];
  printf(">produced %d\n", buff->buffer[buff->tail]);

  buff->tail = (buff->tail + 1) % CAPACITY;
  buff->in_buff++;
  pthread_cond_signal(&cond_empty);
  pthread_mutex_unlock(&mutex);
 }
 pthread_exit(NULL);
}

void *consume(void* arg)
{
 int rc;
 buffer* buff = (buffer *) arg;
 while (1)
 { 
  rc = pthread_mutex_lock(&mutex);

  if (elements_consumed == JOB_SIZE)
  {
   pthread_mutex_unlock(&mutex);
   pthread_exit(NULL);
   return 0;
  }
  elements_consumed++;

  while (buff->in_buff == 0)
  {   
   rc = pthread_cond_wait(&cond_empty, &mutex);
  }

  // consume  
  printf("<consumed %d\n", buff->buffer[buff->head]);
  sum_consumed += buff->buffer[buff->head];
  buff->head = (buff->head + 1) % CAPACITY;
  buff->in_buff--;
  pthread_cond_signal(&cond_full);
  pthread_mutex_unlock(&mutex);
 }
 pthread_exit(NULL);
 return 0;
}

Все переменные правильно инициализированы.Задача состоит в том, чтобы создать элементы JOB_SIZE и использовать их.Время от времени он застревает в мертвом замке.Я совершенно новичок в потоках posix, поэтому я, вероятно, упускаю что-то очень очевидное (продюсеры / потребители много раз делали в java / C # / python, но сейчас я действительно застрял).Я знаю, что гораздо проще сделать это с семафорами, но мне нужно сделать это следующим образом.

Есть предложения?

1 Ответ

3 голосов
/ 04 ноября 2010

Вы использовали cond_empty в обе стороны для ожидания.Вы сигнализируете (но никогда не ждете) cond_full.

...