生产者不加延时,消费者加延时,才能正常消费,如果消费者不加延时,生产者加延时,就是超前消费,不适合社会发展,所以也就没有意义了,消费是空的

 

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

pthread_cond_t buffernotempty=PTHREAD_COND_INITIALIZER;//生产者条件变量的静态初始化
pthread_cond_t buffernotefull= PTHREAD_COND_INITIALIZER;//消费者条件变量的静态初始化

pthread_mutex_t mutex; 

 #define LOOPNUM 50  //定义循环次数
 #define BUFMAX    5

  int  buffer[BUFMAX];//定义一个数组
 int val =0;// 定义一个可递增的变量,最后要放到数组中
 unsigned int counter = 0;//记录生产者生产的个数


void *producer(void *arg)
{  int i=0;
 for(i=0;i< LOOPNUM;i++)
 {
  if( 0 > pthread_mutex_lock(&mutex))//加锁
  {
   perror("producer : pthread_mutex_lock");
   exit(-1);
  }
  if(counter == BUFMAX)//判断生产满了没有,如果满了,就等待
  {
   if( 0 !=  pthread_cond_wait ( &buffernotefull ,&mutex))
   {
    perror ("producer:pthread_cond_wait ");
    exit(-1);
   }  
  }
  if( 0 > pthread_mutex_unlock(&mutex))//解锁
  {
   perror("producer: pthread_mutex_unlock");  
   exit(-1);
  }
  buffer[i % BUFMAX] =val++;//向数组中放数

  if( 0 > pthread_mutex_lock(&mutex))//加锁
  {

   perror("producer: pthread_mutex_lock");
   exit(-1);
  }

  counter++;//记录加的数的个数
  fprintf(stdout,"[producer] total number:%d\n",counter);//输出记录的个数
  if(0!= pthread_cond_signal(&buffernotempty))//释放生产者的线程
  {
   perror("producer : pthread_cond_signal");
   exit(-1);
  }

  if(  0  > pthread_mutex_unlock(&mutex))//解锁
  {
   perror("producer: pthread_mutex_unlock");
   exit(-1);
  }
  //sleep(1);

 }
 pthread_exit((void *)0);//终止生产者这个线程

}


void *user(void *arg)//消费者
{ int i=0;
 for(i=0;i<LOOPNUM;i++)
 {
  pthread_mutex_lock(&mutex);//加锁
  if( 0  == counter)//判断是否为空
  {
   pthread_cond_wait(&buffernotempty,&mutex);//如果为空则等待
  }
  pthread_mutex_unlock(&mutex);//解锁

  fprintf(stdout,"[used]: %d \n",buffer[i % BUFMAX]);//输出数组中的生产的个数

  pthread_mutex_lock (&mutex);//加锁
  counter--;//消费
  fprintf(stdout,"[user]total number: %d \n",counter);//消费情况
  pthread_cond_signal(&buffernotefull);//释放消费空间
  pthread_mutex_unlock ( &mutex);//解锁
  sleep(3);
 }
 pthread_exit((void *)0);//终止消费者这个线程
}


int main(void)
{

 pthread_t th1,th2;
 pthread_attr_t threadAttr;
 pthread_attr_init(&threadAttr);

 //pthread_create(&th2,&threadAttr,user,(void *)0);//这种情况是先创建消费者
 //sleep(1);
 pthread_create(&th1,&threadAttr,producer,(void *)0);//另一种情况是先创建生产者
 sleep(1);
 pthread_create(&th2,&threadAttr,user,(void *)0);
 


 pthread_join(th1,NULL);// 用来获得另一个线程的终止状态并且释放该线程所占的资源
 pthread_join(th2,NULL);
 
}