当前位置: 首页 > article >正文

【操作系统】基于信号量与PV操作解决东西向汽车过独木桥问题

【操作系统】基于信号量与PV操作解决东西向汽车过独木桥问题

问题

东西向汽车过独木桥,为了保证安全,只要桥上无车,则允许一方的汽车过桥,待一方的汽车全部过完后,另一方的汽车才允许过桥。某一时刻,桥上可以有同方向的多辆车。试用信号量写出同步算法。

思路

定义信号量

  • bridge:表示桥的状态,初始值为1。
  • east:用于保护东向车辆计数的信号量,初始值为1。
  • west:用于保护西向车辆计数的信号量,初始值为1。
  • east_count:表示东向等待过桥的车辆数,初始值为0。
  • west_count:表示西向等待过桥的车辆数,初始值为0。

东向车辆过桥的过程

  1. 进入临界区:等待 east 信号量
  2. 增加东向车辆计数
  3. 如果是第一个东向车辆,等待 bridge 信号量
  4. 离开临界区:释放 east 信号量
  5. 过桥
  6. 进入临界区:等待 east 信号量
  7. 减少东向车辆计数
  8. 如果是最后一个东向车辆,释放 bridge 信号量
  9. 离开临界区:释放 east 信号量

西向车辆过桥的过程

  1. 进入临界区:等待 west 信号量
  2. 增加西向车辆计数
  3. 如果是第一个西向车辆,等待 bridge 信号量
  4. 离开临界区:释放 west 信号量
  5. 过桥
  6. 进入临界区:等待 west 信号量
  7. 减少西向车辆计数
  8. 如果是最后一个西向车辆,释放 bridge 信号量
  9. 离开临界区:释放 west 信号量

伪代码

semaphore bridge = 1;    // 桥的状态
semaphore east = 1;      // 保护东向车辆计数的信号量
semaphore west = 1;      // 保护西向车辆计数的信号量
int east_count = 0;      // 东向等待过桥的车辆数
int west_count = 0;      // 西向等待过桥的车辆数

cobegin
process east_car() {
    while(true) {
        P(east);
        east_count++;
        if(east_count == 1) {
            P(bridge);  // 第一个东向车辆请求桥
        }
        V(east);
        
        cross_bridge();

        P(east);
        east_count--;
        if(east_count == 0) {
            V(bridge);  // 最后一个东向车辆离开桥
        }
        V(east);
    }
}
coend

cobegin
process west_car() {
    while(true) {
        P(west);
        west_count++;
        if(west_count == 1) {
            P(bridge);  // 第一个西向车辆请求桥
        }
        V(west);

        cross_bridge();

        P(west);
        west_count--;
        if(west_count == 0) {
            V(bridge);  // 最后一个西向车辆离开桥
        }
        V(west);
    }
}
coend

http://www.kler.cn/a/445585.html

相关文章:

  • 7-2 排序
  • [数据结构] 链表
  • C++ 面向对象编程:友元、
  • word实现两栏格式公式居中,编号右对齐
  • STM32MP1linux根文件系统目录作用
  • AFL-Fuzz 的使用
  • GMSSL的不同python版本
  • Chapter 18 CMOS Processing Technology
  • HTML 有效 DOCTYPES
  • 算法题(10):好数
  • STM32-- keil -常用功能
  • Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
  • 并发修改导致MVCC脏写问题
  • 【后端面试总结】什么是CAP原理
  • 常用es命令
  • 网络协议栈学习(一)socket通信实例
  • 王佩丰24节Excel学习笔记——第十四讲:日期函数
  • 我的性能优化经验
  • 中间件 mysql安装
  • SpringCloud 集成 Eureka服务,本机测试
  • 如何快速提升网站的Google SEO流量?
  • 微信小程序:获取,修改data中的数据(直接取出,通过变量取出)
  • 阿里云Maven库地址、查看各个版本的jar包
  • Python球球大作战
  • petalinux 错误汇总
  • 品牌在社交媒体上的营销框架,有哪些重要节点?