生产者:生产数据的
消费者:消费数据的
利用缓冲区
#define BUFF_MAX 30
int buff[BUFF_MAX];
int in=0;
int out=0;
pthread_mutex_t mutex;
sem_t sc_sem;
sem_t xf_sem;
//多线程实现
void *sc_fun(void*arg)
{
for(int i=0;i<BUFF_MAX;i++)
{
sem_wait(&sc_sem);
pthread_mutex_lock(&mutex);
buff[in]=rand%100;
printf("生产者产生数据%d,在%d",buff[in],in);
in=(in+1)%BUFF_MAX;
pthread_mutex_unlock(&mutex);
sem_post(&xf_sem);
}
}
void*xf_fun(void*arg)
{
for(int i=0;i<BUFF_MAX,i++)
{
sem_wait(&xf_sem);
pthread_mutex_lock(&mutex);
pritf("消费者读取数据%d,在%d",buff[out],out);
out=(out+1)%BUFF_MAX;
pthread_mutex_unlock(&mutex);
sem_post(&sc_sem);
}
}
int main()
{
pthread_mutex_init(&mutex,NULL);
sem_init(&sc_sem,0,BUFF_MAX);
sem_init(&xf_sem,0,0);
srand(int)time(NULL);//随机数
//初始化线程
pthread_t sc_id[2];
for(int i=0;i<2;i++)
{
pthread_create(&sc_id[i],NULL,sc_fun,NULL);
}
pthread_t xf_id[3];
for(int i=0;i<3;i++)
{
pthread_create(&xf_id[i],NULL,xf_fun,NULL);
}
//等待线程结束再销毁
for(int i=0;i<2;i++)
{
pthread_join(sc_sem[i],NULL);
}
for(int i=0;i<3;i++)
{
pthread_join(xf_sem[i],NULL);
}
//销毁
pthread_destroy(&sc_sem);
pthread_destroy(&xf_sem);
pthread_mutex_destroy(&mutex);
exit(0);
}