题目
使用条件变量实现2生产者2消费者模型,注意1个生产者在生产的时候,另外一个生产者不能生产
代码
pthread_mutex_t mutex[4];
pthread_cond_t cond1,cond2;
int sum=0;
int need1=99,need2=99;
int flag=1;
void* sell1(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex[0]);
sleep(1);
sum+=3;
printf("生产者A 生产完毕 现存 %d\n",sum);
pthread_mutex_unlock(&mutex[0]);
}
}
void* sell2(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex[0]);
sleep(2);
sum+=5;
printf("生产者B 生产完毕 现存 %d\n",sum);
pthread_mutex_unlock(&mutex[0]);
}
}
void* buy1(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex[1]); //上锁
//生成随机数
srand((unsigned)time(NULL));
need1=rand()%5+1;
if(need1>sum) //商品不足,则等待商品足够
{
printf("\t产品不足 消费者A 等待中 需求 %d\n",need1);
pthread_cond_wait(&cond1,&mutex[3]);
sum-=need1;
}
else if (need1<=sum)
{
sum-=need1;
}
printf("消费者A 需求 %d 购买成功 现存 %d\n",need1,sum);
pthread_mutex_unlock(&mutex[1]); //解锁
}
}
void* buy2(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex[2]); //上锁
//生成随机数
srand((unsigned)time(NULL));
need2=rand()%10+1;
if(need2>sum) //商品不足,则等待商品足够
{
printf("\t产品不足 消费者B 等待中 需求 %d\n",need2);
pthread_cond_wait(&cond2,&mutex[3]);
sum-=need2;
}
else if (need2<=sum)
{
sum-=need2;
}
printf("消费者B 需求 %d 购买成功 现存 %d\n",need2,sum);
pthread_mutex_unlock(&mutex[2]); //解锁
}
}
int main(int argc, const char *argv[])
{
pthread_t id1,id2,id3,id4;
pthread_cond_init(&cond1,NULL);
pthread_cond_init(&cond2,NULL);
for(int i=0;i<4;i++)
{
pthread_mutex_init(&mutex[i],NULL);
}
pthread_create(&id1,0,sell1,NULL);
pthread_create(&id2,0,sell2,NULL);
pthread_create(&id3,0,buy1,NULL);
pthread_create(&id4,0,buy2,NULL);
pthread_detach(id1);
pthread_detach(id2);
pthread_detach(id3);
pthread_detach(id4);
while(1)
{
pthread_mutex_lock(&mutex[3]);
if(need1+need2<=sum)
{
printf("回应 消费者A 消费者B\n");
pthread_cond_broadcast(&cond1);
}
else
{
if(need1<=sum)
{
pthread_cond_signal(&cond1);
}
else if(need2<=sum)
{
pthread_cond_signal(&cond2);
}
}
pthread_mutex_unlock(&mutex[3]);
}
return 0;
}
效果