PV操作每日一题-独木桥问题(变式二)


一、问题描述

东西方向汽车过独木桥,为保证安全,只要桥上无车,则允许一方的汽车过桥,待另一方的车全部过完后,另一方的车才允许过桥。且要求各方向的汽车串行过桥,但当另一方提出过桥时,应能阻止对方未上桥的后继车辆,待桥面的车过完后,另一方的汽车开始过桥。


二、问题求解

🔑:

int eastCount=0;        //当前从东边上桥的汽车数量
int westCount=0;        //当前从西边上桥的汽车数量
semaphore bridge=1;     //两边的车互斥申请桥
semaphore eastMutex=1;  //互斥访问eastCount
semaphore westMutex=1;  //互斥访问westCount
semaphore pass=1;       //用于阻断对方后续车辆上桥

East()
{
    while(1)
    {
        P(pass)
        P(eastMutex);
        if(eastCount==0)
        {
            P(bridge);
        }
        eastCount++;
        V(eastMutex);
        V(pass);

        P(maxNum);
        从东边过桥;
        V(maxNum);

        P(eastMutex);
        eastCount--;
        if(eastCount==0)
        {
            P(bridge);
        }
        V(eastMutex);
    }
}

West()
{
    while(1)
    {
        P(pass);
        P(westMutex);
        if(westCount==0)
        {
            P(bridge);
        }
        westCount++;
        V(eastMutex);
        V(pass);

        P(maxNum);
        从西边过桥;
        V(maxNum);

        P(westMutex);
        westCount--;
        if(westCount==0)
        {
            P(bridge);
        }
        V(westMutex);
    }
}


三、碎碎念

pass信号量,在一方想过桥时先申请,申请不到就说明被对方阻断了。同样申请到pass,则阻断对方的进程。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
独木桥问题是指若干人在独木桥上过河,每次只能有两个人同过桥,且必须有一个手电筒,过桥的速度不同,求最短的过桥间。可以使用PV操作来解决这个问题PV操作是指在多线程编程,一个线程需要等待某个条件满足,就挂起自己(P操作),等到条件满足再唤醒自己(V操作)。在独木桥问题,可以使用PV操作来实现多个人过桥的同步。 具体实现方法如下: 1. 创建一个共享变量count,表示当前过桥的人数。 2. 创建两个共享变量isLightOn和isBridgeFree,表示手电筒是否被拿走和桥是否空闲。 3. 创建一个线程函数,代表每个人的行为。当一个人要过桥,首先执行P操作,等待桥空闲和手电筒被拿走;然后将count加1,表示有一个人正在过桥;接着执行V操作,表示桥空闲,可以让其他人过桥了;然后等待另一个人过桥,当另一个人过桥后,再次执行P操作,等待桥空闲和手电筒被拿走;然后将count减1,表示这个人已经过桥了;最后执行V操作,表示桥空闲,可以让其他人过桥了。 4. 创建一个线程函数,代表手电筒的行为。当手电筒需要被拿走,首先执行P操作,等待桥空闲;然后将isLightOn设置为true,表示手电筒被拿走了;接着执行V操作,表示桥空闲,可以让其他人过桥了;等到所有人都过桥后,再次执行P操作,等待桥空闲;然后将isLightOn设置为false,表示手电筒被放回了;最后执行V操作,表示桥空闲,可以让其他人过桥了。 通过上述方法,可以保证每个人过桥都有手电筒,并且不会发生死锁。最短的过桥间为所有人过桥间的最大值。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

森格的博

创作不易,感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值