一道简单的PV操作题

这是川大操作系统的一道期末考试题

There is an cage, and only one animal can be put into this cage. The hunters can put tiger into the cage, and farmers can put the pig into the cage. When there is an animal in the cage, if the animal is a tiger, zoo can take it from the cage, and if the animal is a pig, the hotel can take it from the cage. Please describe the above process with the semaphore.

翻译如下:有一个笼子,这个笼子只能关一只动物。猎人可以把老虎关进笼子、
农民可以把猪关进笼子里。当笼子里有动物时,如果是老虎,动物园可以把它从笼子里拿出来,如果是猪,酒店可以把它从笼子里拿出来,请用信号量描述这些进程。

思路如下:
放动物:先判断是否能放入动物(即笼子是否为空),然后再互斥打开笼子放动物
取动物:判断是否是自己想要的动物,然后互斥打开笼子带走,笼子就为空了。

semaphore mutex1=1; //互斥访问笼子
semaphore mutex2=1;//当前是否能放动物
semaphore flag1=0;//笼子里是否有老虎
semaphore flag2=0;//笼子里是否有猪
hunter(){
	P(mutex2)
	P(mutex1);
	打开空的笼子,放入老虎。
	V(flag1);
	V(mutex1);
}
farmer(){
	P(mutex2);
	P(mutex1);
	打开空的笼子,放入猪。
	V(flag2);
	V(mutex1)
}
zoo(){
	P(flag1);
	P(mutex1);
	打开有老虎的笼子,带走老虎。
	V(mutex2);
	V(mutex1);
}
hotel(){
	P(flag2);
	P(mutex1);
	打开有猪的笼子,带走猪。
	V(mutex2);
	V(mutex1);
}

此时还能优化,我们发现可以把互斥信号量变成一个

semaphore mutex=1; //能否放入动物
semaphore flag1=0;//笼子里是否有老虎
semaphore flag2=0;//笼子里是否有猪
hunter(){
	P(mutex);
	打开空的笼子,放入老虎。
	V(flag1);
	关闭笼子。
}
farmer(){
	P(mutex);
	打开空的笼子,放入猪。
	V(flag2);
}
zoo(){
	P(flag1);
	打开有老虎的笼子,带走老虎。
	V(mutex);
}
hotel(){
	P(flag2);
	打开有猪的笼子,带走猪。
	V(mutex);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值