请用PV信号量解决以下问题: (1)汽车从东西方向过独木桥,要求东西方交替通过一辆车.(第1辆车的方向自己确定。某一时刻,桥上最多有1辆车) )

请用PV信号量解决以下问题:
(1)汽车从东西方向过独木桥,要求东西方交替通过一辆车.(第1辆车的方向自己确定。某一时刻,桥上最多有1辆车) ) (2)只要桥上无车,则允许一方的汽车过桥,待一方的汽车全部过完后,另一方的汽车才允许过桥。(某一时刻,桥上可以有同方向的多辆车)

一、汽车从东西方向过独木桥,要求东西方交替通过一辆车.(第1辆车的方向自己确定。某一时刻,桥上最多有1辆车) )。
semaphore lmutex,rmutex;
lmutex=1;rmutex=0;//假设先通过左边的车//信号量定义和初始化
process Pleft() {//左方向车的进程
while(true) {
P(lmutex);
过独木桥;
V(rmutex);
}
}

process Pright() {//右方向车的进程
while(true) {
P(rmutex);
过独木桥;
V(lmutex);
}
}

二、东西向汽车过独木桥,为了保证安全,只要桥上无车,则允许一方的汽车过桥,待一方的汽车全部过完后,另一方的汽车才允许过桥。(某一时刻,桥上可以有同方向的多辆车)
semaphore mutex,lmutex,rmutex;
lmutex=rmutex=1;mutex=1;
int lcounter,rcounter;
lcounter=0;rcounter=0;//信号量和变量的定义和初始化
process Pleft() {//左方向车的进程
while(true) {
P(lmutex);
if (lcounter0) P(mutex);
lcounter++;
V(lmutex);
过独木桥;
P(lmutex);
 lcounter–;
if(lcounter
0) V(mutex);
V(lmutex);
}
}

process Pright() {//右方向车的进程
while(true) {
P(rmutex);
if (rcounter0) P(mutex);
rcounter++;
V(rmutex);
过独木桥;
P(rmutex);
rcounter–;
if(rcounter
0) V(mutex);
V(rmutex);
}
}

三、在第二题的基础上,限制桥面上最多可以有k辆汽车通过。(当K=1时,某一时刻,最多有1辆车在桥面上)
semaphore mutex,lmutex,rmutex,bridge;
lmutex=rmutex=1;mutex=1;bridge=k;
int lcounter,rcounter;
lcounter=0;rcounter=0;
process Pleft() {
while(true) {
P(lmutex);
if (lcounter0) P(mutex);
lcounter++;
V(lmutex);
P(bridge);
过独木桥;
V(bridge);
P(lmutex);
 lcounter–;
if(lcounter
0) V(mutex);
V(lmutex);
}
}

process Pright() {
while(true) {
P(rmutex);
if (rcounter0) P(mutex);
rcounter++;
V(rmutex);
P(bridge);
过独木桥;
V(bridge);
P(lmutex);
rcounter–;
if(rcounter
0) V(mutex);
V(rmutex);
}
}

四、在第二题的基础上,要求各方向的汽车串行过桥,但当另一方提出过桥时,应能阻止对方未上桥的后继车辆,待桥面上的汽车过完桥后,另一方的汽车开始过桥。
semaphore mutex,lmutex,rmutex,wait;
lmutex=rmutex=1;mutex=1,wait=1;
int lcounter,rcounter;
lcounter=0;rcounter=0;
process Pleft() {
while(true) {
P(wait);
P(lmutex);
if (lcounter0) P(mutex);
lcounter++;
V(lmutex);
V(wait);
过独木桥;
P(lmutex);
 lcounter–;
if(lcounter
0) V(mutex);
V(lmutex);
}
}

process Pright() {
while(true) {
P(wait);
P(rmutex);
if (rcounter0) P(mutex);
rcounter++;
V(rmutex);
V(wait);
过独木桥;
P(lmutex);
rcounter–;
if(rcounter
0) V(mutex);
V(rmutex);
}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值