Linux16(2)生产者消费者

生产者:生产数据的

消费者:消费数据的

利用缓冲区

 


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值