2015-10-11 40 views
1

我想为单个生产者和单个消费者实现一个程序。在我的代码下面,消费者不能消费第一件商品。我无法确定错误,并且这里的项目是以同步的方式生成和使用的。我想实现它,以便生产者生成任意数量的项目,然后消费者将使用这些项目,但不是以同步方式。c中的生产者 - 消费者没有使用信号量/条件变量

void *consumer() 
{ 
    while (1) 
    { 
     pthread_mutex_lock(&m); 

     pthread_cond_signal(&pd); 

     pthread_cond_wait(&cn, &m); 

     printf("Consumed item is : %d\n", count); 

     pthread_mutex_unlock(&m); 
     if (count == SIZE) 
     { 
     printf("Consumer can not consume.. Buffer empty..\n"); 
     break;  
     } 
    } 
} 

void *producer() 
{ 
    while (1) 
    { 
     if (count == SIZE) 
     { 
     printf("Producer can not produce.. Buffer full !!\n"); 
     break; 
     } 
     pthread_mutex_lock(&m); 
     printf("Produced item is : %d\n", ++count); 
     pthread_cond_signal(&cn); 

     if (count != SIZE) 
     pthread_cond_wait(&pd, &m); 

     pthread_mutex_unlock(&m); 

    } 
} 
+1

请修复您的缩进。 –

+0

没有人曾经无条件等待...... – UmNyobe

+1

如果你不想让制片人等待,那么你为什么要在制片人中调用'pthread_cond_wait'?毫不意外的是,制造商会一直等到消费者发出信号。 – kaylum

回答

0

我改变了代码来简化它。这个简单的方法不需要条件变量。在你的代码中,你忘记了实际消耗,所以它不起作用。
我会用停止条件替换生产者和消费者无限循环 - 例如产生X项并停止,否则,此代码的结果将是随机的。生产者可以在消费者有机会运行之前填充缓冲区,或者消费者可以看到空的缓冲区并停止。

void *consumer() 
{ 
    int consumed; 
    while (1) 
    { 
     pthread_mutex_lock(&m); 
     consumed = count; 
     count = 0; // consume all 
     printf("Consumed item is : %d\n", consumed); 
     pthread_mutex_unlock(&m); 
     if (consumed == 0) 
     { 
      printf("Consumer can not consume.. Buffer empty..\n"); 
      break;  
     } 
    } 
} 

void *producer() 
{ 
    while (1) 
    { 
     pthread_mutex_lock(&m); 
     if (count == SIZE) 
     { 
      printf("Producer can not produce.. Buffer full !!\n"); 
      pthread_mutex_unlock(&m); 
      break; 
     } 
     else 
     { 
      printf("Produced item is : %d\n", ++count); 
     } 

     pthread_mutex_unlock(&m); 
    } 
} 
+0

我得到的输出: 生产产品:1种 生产产品:2 生产的产品:3 生产项目是:4 生产项目是:5 生产者不能生产..缓冲器满! 消费品是:5 消费者不能消费..缓冲空.. – nlm

+0

这是预期的,请阅读我的答案。生产者填充缓冲区并存在。在生产者完成所有工作后,消费者立即清理所有5个物品。消费者第二次运行时,缓冲区当然是空的。尝试将SIZE提升到更大的值,或者在释放互斥体以允许其他线程运行后执行“睡眠(1)”。 – egur

相关问题