上图是一道操作系统PV操作的习题,用Python解决之,建立一个线程模拟行人从北向南过桥,另一个线程模拟行人从南向北过桥,建立四个信号量,分别实现对桥、北桥段、南桥段和桥中央的互斥。

north_side = threading.Semaphore(1) #北桥段只能通过一人
north= threading.Semaphore(1)  #北向南一次只允许一人过桥
south_side = threading.Semaphore(1) #南桥段只能通过一人
south= threading.Semaphore(1)  #南向北一次只允许一人过桥
person = threading.Semaphore(2) #桥中央允许两人通过或歇息

随机生成20个线程(行人),观察行人过桥的状况,符合题目要求,运行结果如下图。

import threading,time,random
north_side = threading.Semaphore(1)
north= threading.Semaphore(1)
south_side = threading.Semaphore(1)
south= threading.Semaphore(1)
person = threading.Semaphore(2)def north_south():t = threading.currentThread()north_side.acquire()north.acquire()print('行人%dnorth_south上北桥段\n'%t.ident)time.sleep(random.random())north.release()person.acquire()            print('行人%dnorth_south行至桥中央\n'%t.ident)time.sleep(random.random())person.release()south.acquire()            print('行人%dnorth_south上至南桥段\n'%t.ident)time.sleep(random.random())south.release()print('行人%dnorth_south下桥\n'%t.ident)north_side.release()
def south_north():t = threading.currentThread()south_side.acquire()south.acquire()print('行人%dsouth_north上南桥段\n'%t.ident)time.sleep(random.random())south.release()person.acquire()            print('行人%dsouth_north行至桥中央\n'%t.ident)time.sleep(random.random())person.release()north.acquire()            print('行人%dsouth_north上至北桥段\n'%t.ident)time.sleep(random.random())            north.release()print('行人%dsouth_north下桥\n'%t.ident)south_side.release()            if __name__=='__main__':threads = []for i in range(20):        r=random.randint(0,1)if r==0:p = threading.Thread(target=north_south)else:p = threading.Thread(target=south_north)p.start()threads.append(p)for t in threads:t.join()

Python解决操作系统习题中PV操作过桥问题相关推荐

  1. 操作系统中PV操作之顾客理发师问题

    PV操作:对信号量进行相应操作 S:信号量 P:请求操作,相当于S=S-1:S>=0,进程继续进行 V:释放操作,相当于S=S+1,S>0,进程被唤醒 理发师问题 一个理发师,一把理发椅, ...

  2. 【操作系统】经典PV操作题目

    5个经典PV操作题(附答案) 三个进程之间的同步 pv操作的经典习题 PV操作题型整理 生产者和消费者 生产者消费者问题 当只有一个生产者和一个消费者的时候,且只有一个缓冲区 要考虑生产者和消费者两个 ...

  3. 【操作系统-进程】PV操作——吸烟者问题

    文章目录 吸烟者问题 解题步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step 5. 定 ...

  4. 【操作系统-进程】PV操作——生产者消费者问题

    文章目录 生产者消费者问题的万能方法步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step ...

  5. python文件式_python中文件操作的六种模式及对文件某一行进行修改的方法

    一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...

  6. Python 解决写入csv中间隔一行空行问题

    转载解决写入csv中间隔一行空行问题 写入csv: with open(birth_weight_file,'w') as f:writer=csv.writer(f)writer.writerow( ...

  7. python解决数据框中添加一行或者一列(DataFrame的行列处理)

    1.解决数据框中添加一行(给定值) ###原数据框data_Peak_2 = pd.DataFrame({"Peak_density": np.ndarray.tolist(hma ...

  8. 操作系统中PV操作实现进程同步与互斥问题(以苹果橘子问题为例)

    桌上有一空盘,允许存放一个水果.爸爸可向盘中放苹果,也可向盘中放桔子, 儿子专等吃盘中的桔子,女儿专等吃盘中的苹果.规定当盘空时,一次只能放一个水果供吃者取用, 请用P.v原语实现爸爸.儿子.女儿三个 ...

  9. Python在操作系统层面上的操作

    文件 用open()创建文件 用exist()检查文件或者目录是否存在 用isfile()检查是否为文件:用isdir()检查是否为路径:用isabs()检查是否为绝对路径 用copy()复制文件(i ...

最新文章

  1. android监听器在哪里创建,[转载]android开发中创建按钮事件监听器的几种方法
  2. Mac系统修改root用户密码,mac切换root用户登录实例演示
  3. 每次执行java命令 都要source_跟着平台混了四年,现在要单飞了!
  4. Faster-RCNN训练时遇到的问题
  5. 我希望早几年知道的5个Unix命令
  6. bootstrap-vue 中 model 基础用法
  7. 做游戏,学编程(C语言) 1 实现弹跳小球
  8. 2017蓝桥杯B组:取数位(递归,求余和除法)
  9. springboot maven父项目脚手架
  10. SpringBoot修改内置tomcat版本
  11. 软件项目进度控制表(自制)
  12. GB50174-2008 电子信息系统机房设计规范
  13. Julia数据可视化:Plots.jl包的使用
  14. 计算机应用基础教育教学工作总结,计算机应用基础教学工作总结
  15. 魔性的数字人形时钟动态pc端电脑屏幕保护
  16. java jvm sdk_JDK、SDK、JRE、JVM概念详解
  17. google map
  18. 深夜一个考研女生:“我焦虑症犯了”
  19. 俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。
  20. 自动控制原理笔记-改善性能的措施-高阶系统动态性能

热门文章

  1. el-table表格中行样式修改不生效
  2. 均值滤波高斯滤波中值滤波
  3. 大数据系统的基础,大数据存储和计算技术
  4. console、tty、pts、pty、Terminal、Physical console、Virtual console、Pseudo Terminal关系解析...
  5. 关于我学习css的感悟和心得
  6. Byte[]字节反转
  7. Oracle 11gR2 RAC 添加节点
  8. java pmd checkstyle_maven配置pom文件添加PMD检查,添加checkStyle检查,JDepend等检查功能...
  9. php aec 解密sha1,PHP加密解密实例分析 - sha1
  10. 纯前端实现:下载电子书 手机观看