【问题标题】:pthreads producer-consumer deadlockpthreads生产者-消费者死锁
【发布时间】:2011-05-04 19:30:38
【问题描述】:

我写了以下代码:

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 中多次使用,但现在我真的被卡住了)。我知道使用信号量更容易做到这一点,但我需要以这种方式做到这一点。

有什么建议吗?

【问题讨论】:

  • 涉及多少个 condvar?制作人是否应该等待cond_full 而不是cond_empty

标签: c multithreading pthreads deadlock producer-consumer


【解决方案1】:

你在两边都使用了 cond_empty 来等待。你发出信号(但从不等待)cond_full。

【讨论】:

  • 在这两种情况下等待cond_empty 都应该有效,但您需要确保在这两种情况下也都发出信号。
  • 在这之后我感到有点尴尬。我不知道我怎么没看到这个。 Tnx。
  • @Anthony Williams:一开始我以为他是这么做的,所以我几乎没有发现其他情况。
猜你喜欢
  • 2013-03-06
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2014-04-03
  • 2017-04-12
相关资源
最近更新 更多