#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);
}