进程同步、互斥--吸烟者问题

1、问题描述:一个系统有三个抽烟者和一个供应者进程。每个抽烟者不停地卷烟并抽掉。卷烟需要三种材料:烟草、纸和胶水。三个抽烟者中,第一个有烟草,第二个有纸,第三个有胶水。供应者无限提供三种材料,每次提供两种,拥有剩下那种材料的抽烟者可以卷一根烟并抽掉,并告诉供应者,供应者再提供下两种材料(让三个消费者轮流抽烟)。
2、关系分析
互斥关系:互斥访问供应区
mutex=1; (由于缓冲区大小为1,可不使用mutex)
同步关系:
(1)供应区有组合1,抽烟者1才能抽烟
offer1=0;
(2)供应区有组合2,抽烟者2才能抽烟
offer2=0;
(3)供应区有组合3,抽烟者3才能抽烟
offer3=0;
(4)抽烟完成后,供应者才能供应相应组合
finish=0; //抽烟是否完成
i=0; //用于实现轮流抽烟
3、代码实现

//吸烟者1
smoker1(){
	P(offer1);
	卷烟吸烟
	V(finish);
}
//吸烟者2
smoker2(){
	P(offer2);
	卷烟吸烟
	V(finish);
}
//吸烟者3
smoker3(){
	P(offer3);
	卷烟吸烟
	V(finish);
}
//供应者
supplier(){
	while(1){
		if(i==0){
			V(offer1);
			将组合1放到供应区
		}else if(i==1){
			V(offer2);
			将组合2放到供应区
		}else if(i==2){
			V(offer3);
			将组合3放到供应区
		}
		i=(++i)%3;
		P(finish);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值