#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#define BUFF_MAX 10
#define SC_NUM 2
#define XF_NUM 3
int buff[BUFF_MAX];
int in=0;
int out=0;
sem_t sem_empty;
sem_t sem_full;
pthread_mutex_t mutex;
void* sc_thread(void*arg)
{
int index=(int)arg;
for(int i=0;i<30;i++)
{
sem_wait(&sem_empty);//有没有空闲位置
pthread_mutex_lock(&mutex);
buff[in]=rand()%100;
printf("第%d个线程,产生数据:%d,在%d位置\n",index,buff[in],in);
in=(in+1)%BUFF_MAX;
pthread_mutex_unlock(&mutex);
sem_post(&sem_full);
}
}
void* xf_thread(void*arg)
{
int index=(int)arg;
for(int i=0;i<20;i++)
{
sem_wait(&sem_full);
pthread_mutex_lock(&mutex);
printf("-----第%d个线程,消费数据:%d,在%d位置\n",index,buff[out],out);
out=(out+1)%BUFF_MAX;
pthread_mutex_unlock(&mutex);
sem_post(&sem_empty);
}
}
int main()
{
sem_init(&sem_empty,0,BUFF_MAX);
sem_init(&sem_full,0,0);
pthread_mutex_init(&mutex,NULL);
srand((int)time(NULL));
pthread_t sc_id[SC_NUM];
pthread_t xf_id[XF_NUM];
for(int i=0;i<SC_NUM;i++)
{
pthread_create(&sc_id[i],NULL,sc_thread,(void*)i);//生产者创建
}
for(int i=0;i<XF_NUM;i++)
{
pthread_create(&xf_id[i],NULL,xf_thread,(void*)i);
}
for(int i=0;i<SC_NUM;i++)
{
pthread_join(sc_id[i],NULL);
}
for(int i=0;i<XF_NUM;i++)
{
pthread_join(xf_id[i],NULL);
}
sem_destroy(&sem_empty);
sem_destroy(&sem_full);
pthread_mutex_destroy(&mutex);
printf("mian over\n");
exit(0);
}
11-16