生产者-消费者”问题 用C语言编写

2025-04-02 18:14:44
推荐回答(1个)
回答1:

#include  
#include  
#include  
#include  
#include  
  
#define PRODUCER 10//生产者数量  
#define CONSUMER 8//消费者数量  
#define BUFFER 20//缓冲区数量  
  
sem_t empty,full;//同步信号量  
pthread_mutex_t mutex;//互斥信号量  
int buffer[BUFFER]; //缓冲区  
  
int producer_id=0,consumer_id=0;//生产者消费者ID  
int index_in=0,index_out=0;//生产者 消费者 存放 消费的位置  
  
void print()//输出缓冲区  
{  
   int i;  
   printf("Buffer:\n");  
   for(i=0;i<20;i++)  
   {  
      printf("___");  
   }  
   printf("\n");  
   for(i=0;i<20;i++)  
      printf("|%d|",buffer[i]);  
   printf("\n");  
   for(i=0;i<20;i++)  
   {  
      printf("———");  
   }   
   printf("\n");  
}  
void *Producer()//生产者函数  
{  
   int ID=++producer_id;  
  
   while(1)  
   {  
     sleep(3);  
     sem_wait(&empty);  
     pthread_mutex_lock(&mutex);  
     index_in=index_in%BUFFER;  
  
     printf("Producer %d in %d.\n",ID,index_in);  
     buffer[index_in]=1;//缓冲区置0  
     print();//输出缓冲区情况  
     index_in++;  
     pthread_mutex_unlock(&mutex);  
     sem_post(&full);  
   }  
}  
void *Consumer()//消费者函数  
{  
   int ID=++consumer_id;  
  
   while(1)  
   {  
     sleep(3);  
     sem_wait(&full);  
     pthread_mutex_lock(&mutex);  
     index_out=index_out%BUFFER;  
  
     printf("\033[01;34mConsumer %d in %d\033[0m\n",ID,index_out);  
     buffer[index_out]=0;//缓冲区置0  
     print();//输出缓冲区情况  
     index_out++;  
     pthread_mutex_unlock(&mutex);  
     sem_post(&empty);  
   }  
}  
  
int main()  
{  
   //freopen("text.txt","w",stdout);  
   int rthread[18],i;  
   pthread_t producer[PRODUCER];//生产者  
   pthread_t consumer[CONSUMER];//消费者  
  
   int sinit1=sem_init(&empty,0,BUFFER);//初始化同步信号量  
   int sinit2=sem_init(&full,0,0);  
   int minit =pthread_mutex_init(&mutex,NULL);//初始化互斥信号量  
   if(sinit1 && sinit2)  
   {  
     printf("sem initialize failed /n");  
     exit(1);  
   }  
   if(minit)  
   {  
     printf("sem initialize failed /n");  
     exit(1);  
   }  
   for(i=0;i   {  
      rthread[i]=pthread_create(&producer[i], NULL, Producer, NULL);  
      if(rthread[i])  
      {  
          printf("producer %d create failed /n", i);  
          exit(1);  
      }  
   }  
   for(i=0;i   {  
      rthread[i]=pthread_create(&consumer[i], NULL, Consumer,NULL);  
      if(rthread[i])  
      {  
          printf("consumer %d create failed /n", i);  
          exit(1);  
      }  
   }  
   for(i=0;i   {  
      pthread_join(producer[i],NULL);  
   }  
   for(i=0;i   {  
      pthread_join(consumer[i],NULL);  
   }  
   exit(0);  
}