并发进程同步

P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。也就是不好的一方面。
V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。也就是变好的一方面。

1,桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

解:设三个信号量S、So、Sa;信号量S表示盘子是否为空,其初值为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:

int S=1;
int Sa=0;
int So=0;
main(){
	begin
		father();
		son();
		daughter();
	end
}
father(){
	while(1{
		P(S);//将水果放入盘中
		if(放入盘中的是桔子){
			V(So);
		}else{
			V(Sa);
		}
	}
}
son(){
	while(1){
		P(So);//从盘中取出桔子
		V(S);//吃橘子
	}
}
daughter(){
	while(1){
		P(Sa);//从盘中取出苹果
		V(S);//吃苹果
	}
}

2,设公共汽车上,司机和售票员的活动分别是:

在这里插入图片描述

在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现他们的同步。

解:司机和售票员的活动得同步,如下所示

司机售票员
启动车辆关车门
正常行车售票
到站停车开车门

设两个信号量S1,S2;
S1表示是否运行司机启动汽车,其初值为0
S2表示是否运行售票员开门,其初值为0
用P、V原语描述如下:

int S1=0;
int S2=0;
main(){
	begin
		driver();
		busman();
	end
}
driver(){
	while(1){
		P(S1);
		启动车辆;
		正常行车;
		到站停车;
		V(S2);
	}
}
busman(){
	while(1){
		关车门;
		V(S1);
		售票;
		P(S2);
		开车门;
		上下乘客;
	}
}

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond谚语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值