#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include <semaphore.h>
#include <stdlib.h>
#define M 20
int in = 0;
int out = 0;
int buf[M] = {0};
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
int product_id = 0;
int consumer_id = 0;
void print()
{
int i;
for(i=0;i<M;i++)
{
printf("%d\n",buf[i]);
}
}
void* product()//生产者
{
int id = ++product_id;
while(1)
{
sleep(1);
sem_wait(&empty);
pthread_mutex_lock(&mutex);
in = in%M;
printf("product%d in %d\n",id,in);
buf[in] = 1;
print();
++in;
printf("product down...\n");
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *consumer()//消费者
{
int id = ++consumer_id;
while(1)
{
sleep(1);
sem_wait(&full);
pthread_mutex_lock(&mutex);
out = out%M;
printf("consumer%d out %d\n",id,out);
buf[out] = 0;
print();
++out;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
printf(" consumer down...\n");
}
int main ()
{
pthread_t i1,i2;
int init1 = sem_init(&empty,0,M);
int init2 = sem_init(&full,0,0);
int init3 = pthread_mutex_init(&mutex,NULL);
if((init1&&init2)!=0)
{
printf("sem_init is fail\n");
exit(1);
}
if(init3!=0)
{
printf("mutex init is fail\n");
exit(1);
}
int n1 ,i;
for(i=0;i<M;i++)
{
n1 = pthread_create(&i1,NULL,product,(void*)(&i));
if(n1)
{
printf("product%d failed\n",i);
exit(1);
}
}
int n2;
for(i=0;i<M;i++)
{
n2 = pthread_create(&i2,NULL,consumer,(void*)(&i));
if(n2)
{
printf("consumer%d failed\n",i);
exit(1);
}
}
pthread_join(i1,NULL);
pthread_join(i2,NULL);
return 0;
}
Linux下多生产者多消费者--多线程问题
最新推荐文章于 2022-12-27 00:00:37 发布