一座小桥(最多只能承重两个人)横跨南北两岸,任意时刻同一方向只允许一个人过桥,南侧桥段和北侧桥段较窄只能通过一个人,桥中央一处宽敞,允许两个人通过或歇息。试用P(wait)V(signal)操作实现

设置一个num同步信号量,用于控制桥上的人数,初始值为2,表示桥上最多有2个人

南侧s、北侧n桥各设置一个互斥信号量,初始值为1,表示只允许一个人通过南侧桥或北侧桥

同步信号量起”通知“的作用,互斥信号量起“锁”的作用


int num = 2 ;
int south = 1;
int north = 1;

//南侧的人过桥
void toNorth(){
      p(num)//发信号过桥,查看当前桥上是否还可上人,桥上人容量减1(因为桥上人数加1了)
      p(south)//锁南桥
        过南侧桥
        到中间
      v(south)//解锁南桥,后面的人可以接着过
      p(north)//锁北桥
        过北侧桥
      v(north)//解锁北桥,后面的人可以接着过
      v(num)//人过了桥,桥容量加1
        
}
//北侧的人过桥
void toSouth(){
      p(num)//发信号过桥,查看当前桥上是否还可上人,桥上人容量减1(因为桥上人数加1了)
      p(north)//锁北桥
        过北侧桥
        到中间
      v(north)//解锁北桥,后面的人可以接着过
      p(south)//锁南桥
        过南侧桥
      v(south)//解锁南桥
      v(num)//人过了桥,桥容量加1
}

为什么互斥信号量【p(south)】不能在同步信号量【p(num)】之前?也就是先锁桥,再说我要过桥

如果此时桥人数已达上限,中间有两个人,而两岸边的人还可以先把桥锁上,再说要过桥(即使发现锁完之后桥的容量已达上限被阻塞了),就出现中间的人想往两边过,结果过不去,等待岸上的人解锁,两岸的人将桥上锁也上不去桥,因为桥的容量达到上限   所以实现互斥的操作要在实现同步的操作之后

void south bridge(){
p(south)

p(num)
过南
v(south)
到中
p(north)
过北
v(north)

v(num)

}


void north bridge(){
p(north)

p(num)
过北
v(north)
到中
p(south)
过南
v(south)

v(num)

}



参考链接:https://blog.csdn.net/qq_40851744/article/details/103793153

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_40396568

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

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

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

打赏作者

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

抵扣说明:

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

余额充值