#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define PRODUCER 5
#define CONSUMER 5
#define BUFFER 10
sem_t empty,full;
pthread_mutex_t mutex;
int buffer[BUFFER];
int producer_id=0,consumer_id=0;
int index_in,index_out;
void print()
{
printf("Buffer:\n");
for(int i=0;i<BUFFER;i++)
{
printf("___");
}
printf("\n");
for(int i=0;i<BUFFER;i++)
{
printf("|%d|",buffer[i]);
}
printf("\n");
for(int i=0;i<BUFFER;i++)
{
printf("———");
}
printf("\n");
sleep(3);
}
void *Producer()
{
int id=++producer_id;
while(1)
{
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;
print();
index_in++;
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *Consumer()
{
int id=++consumer_id;
while(1)
{
sem_wait(&full);
pthread_mutex_lock(&mutex);
index_out=index_out%BUFFER;
printf("consumer %d in %d.\n",id,index_out);
buffer[index_out]=0;
print();
index_out++;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}
int main()
{
int thread[15];
pthread_t producer[PRODUCER];
pthread_t consumer[CONSUMER];
int inite1=sem_init(&empty,0,BUFFER);
int inite2=sem_init(&full,0,0);
int inite3=pthread_mutex_init(&mutex,NULL);
if(inite1&&inite2)
{
printf("sem initlialize failed \n");
exit(1);
}
if(inite3)
{
printf("mutex initlialize failed \n");
exit(1);
}
for(int i=0;i<PRODUCER;i++)
{
thread[i]=pthread_create(&producer[i],NULL,Producer,NULL);
if(thread[i]!=0)
{
printf("producer %d fail to create \n",i);
exit(0);
}
}
for(int i=0;i<CONSUMER;i++)
{
thread[i]=pthread_create(&consumer[i],NULL,Consumer,NULL);
if(thread[i]!=0)
{
printf("consumer %d fail to create \n",i);
exit(1);
}
}
for(int i=0;i<PRODUCER;i++)
{
pthread_join(producer[i],NULL);
}
for(int i=0;i<CONSUMER;i++)
{
pthread_join(consumer[i],NULL);
}
return 0;
}
生产者消费者算法
最新推荐文章于 2020-12-20 16:40:36 发布