【无标题】

题目

使用条件变量实现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;
}

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值