信号量的PV操作实例
2015-10-24 16:50
447 查看
问题描述
A地和B地之间有一条弯曲的路,其中的每一段路每次只允许一辆自行车通过,且每个方向每次只允许一人通过,但中间有一个”安全岛“(同时允许两辆自行车停留),可供两辆自行车已从两端进人小路情况下错车使用,请设计一个算法使来往的自行车均可顺利通过。
![](https://img-blog.csdn.net/20151024164010150)
问题分析
首先有两个线程,表示从A地到B地,和从B地到A地,那么需要设置几个信号量呢?拿从A到B来说,因为一个方向一次只能过一个人,所以在一个人没到B地之前,都不能有人从A出发,所以需要对这设置一个信号量 ,然后从A地到安全岛之前有一段路,可能这段路被从A到B的人占据,也可能被从B到A的人占据,所以需要对这段路设置一个信号量。同理,从B到A也需要设置这样两个信号量。这是可能会有人想,安全岛只能容纳两个人,要不要对安全岛也设置一个信号量,其实是不需要的。因为一个方向一次只能过一个人,所以在任何时刻,路上最多也两个人,所以不需要对安全岛设置信号量。
问题解决
运行结果
从运行结果可以看到,这是没有问题的。
A地和B地之间有一条弯曲的路,其中的每一段路每次只允许一辆自行车通过,且每个方向每次只允许一人通过,但中间有一个”安全岛“(同时允许两辆自行车停留),可供两辆自行车已从两端进人小路情况下错车使用,请设计一个算法使来往的自行车均可顺利通过。
问题分析
首先有两个线程,表示从A地到B地,和从B地到A地,那么需要设置几个信号量呢?拿从A到B来说,因为一个方向一次只能过一个人,所以在一个人没到B地之前,都不能有人从A出发,所以需要对这设置一个信号量 ,然后从A地到安全岛之前有一段路,可能这段路被从A到B的人占据,也可能被从B到A的人占据,所以需要对这段路设置一个信号量。同理,从B到A也需要设置这样两个信号量。这是可能会有人想,安全岛只能容纳两个人,要不要对安全岛也设置一个信号量,其实是不需要的。因为一个方向一次只能过一个人,所以在任何时刻,路上最多也两个人,所以不需要对安全岛设置信号量。
问题解决
import java.util.concurrent.Semaphore; public class JcMain { private Semaphore mSemaphoreATB = new Semaphore(1); //从A到B的信号量 private Semaphore mSemaphoreBTA = new Semaphore(1); //从B到A的信号量 private Semaphore mSemaphoreRoadA = new Semaphore(1); //RoadA的信号量 private Semaphore mSemaphoreRoadB = new Semaphore(1); //RoadB的信号量 public static void main(String[] args) { JcMain jcMain = new JcMain(); jcMain.begin(); } void begin(){ while(true){ start(); } } void start(){ Thread ATBThread = new Thread(new Runnable(){ public void run() { try { mSemaphoreATB.acquire(); //获得从A到B的信号 mSemaphoreRoadA.acquire(); //获得Road的信号 System.out.println("A-B:通过RoadA,进入安全岛"); mSemaphoreRoadA.release(); mSemaphoreRoadB.acquire(); //获得RoadB的信号 System.out.println("A-B:通过RoadB,到达B"); mSemaphoreATB.release(); //释放从A到B的信号 mSemaphoreRoadB.release(); //释放RoadB的信号 } catch (InterruptedException e) {} } }); Thread BTAThread = new Thread(new Runnable(){ public void run() { try { mSemaphoreBTA.acquire(); //获得从B到A的信号 mSemaphoreRoadB.acquire(); //获得Road的信号 System.out.println("B-A:通过RoadB,进入安全岛"); mSemaphoreRoadB.release(); mSemaphoreRoadA.acquire(); //获得RoadB的信号 System.out.println("B-A:通过RoadA,到达A"); mSemaphoreBTA.release(); //释放从A到B的信号 mSemaphoreRoadA.release(); //释放RoadB的信号 } catch (InterruptedException e) {} } }); ATBThread.start(); BTAThread.start(); } }
运行结果
A-B:通过RoadA,进入安全岛 A-B:通过RoadB,到达B A-B:通过RoadA,进入安全岛 B-A:通过RoadB,进入安全岛 B-A:通过RoadA,到达A A-B:通过RoadB,到达B A-B:通过RoadA,进入安全岛 A-B:通过RoadB,到达B A-B:通过RoadA,进入安全岛 A-B:通过RoadB,到达B B-A:通过RoadB,进入安全岛 B-A:通过RoadA,到达A
从运行结果可以看到,这是没有问题的。
相关文章推荐
- C语言 判断花括号是否成对出现
- Ext Store 转为对象数组字符串
- SPOJ LCS Longest Common Substring
- 创建maven项目时报错:Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4
- 系统利益相关者描述案例
- for循环,如何结束多层for循环
- 欢迎使用CSDN-markdown编辑器
- 重新开博了
- 【iOS】The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install
- hihocoder 1238 Total Highway Distance
- bootstrap之DumpWindowHierarchy
- 类库,框架,应用
- 《设计模式》六大原则之一:迪米特法则
- 【分享(笔试常考易错)】sizeof求数组长度的剖析心得
- CentOS6.5 LAMP平台安装Zabbix2.2.10
- javascript 数组转二维数组
- CGContextRef用法
- List<T> 转换 DataTable
- VC中按钮的MouseDown和MouseUp事件捕捉
- TCP/IP网络编程 基于Linux编程_4 --多线程服务器端的实现