#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#define bufsize 10
#define produce_num 3
#define consume_num 3
int buffer[bufsize];
int product_id=0;
sem_t unused;
sem_t used;
pthread_mutex_t mutex;
pthread_t g_thread[produce_num+consume_num];
int in=0;
int out=0;
void *consume(void *param)
{
int i;
while(1)
{
sem_wait(&used);
pthread_mutex_lock(&mutex);
for(i=0;i<bufsize;i++)
{ printf("%d\t",i);
if(buffer[i]==-1)
{
printf("null\t");
}
else
{
printf("%d\t",buffer[i]);
}
if(out==i)
{
printf("<- consume");
}
printf("\n");
}
buffer[out]=-1;
out=(out+1)%bufsize;
pthread_mutex_unlock(&mutex);
sem_post(&unused);
sleep(1);
}
return NULL;
}
void *produce(void *param)
{
int i;
while(1)
{
sem_wait(&unused);
pthread_mutex_lock(&mutex);
for(i=0;i<bufsize;i++)
{ printf("%d\t",i);
if(buffer[i]==-1)
{
printf("null\t");
}
else
{
printf("%d\t",buffer[i]);
}
if(in==i)
{
printf("<- produce");
}
printf("\n");
}
buffer[in]=product_id;
in=(in+1)%bufsize;
product_id++;
pthread_mutex_unlock(&mutex);
sem_post(&used);
sleep(1);
}
}
int main()
{
int i;
sem_init(&unused,0,bufsize);
sem_init(&used,0,0);
pthread_mutex_init(&mutex,NULL);
for(i=0;i<bufsize;i++)
{
buffer[i]=-1;
}
for(i=0;i<consume_num;i++)
pthread_create(&g_thread[i],0,consume,(void *)i);
for(i=0;i<produce_num;i++)
pthread_create(&g_thread[consume_num+i],0,produce,(void *)i);
for(i=0;i<consume_num+produce_num;i++)
pthread_join(g_thread[i],NULL);
sem_destroy(&unused);
sem_destroy(&used);
pthread_mutex_destroy(&mutex);
}
生产者消费者模式in C
最新推荐文章于 2022-02-23 09:18:20 发布