Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36996
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 179
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-18 17:05
文章分类
文章存档

2014年(3)

2013年(7)

我的朋友

分类: C/C++

2014-04-24 22:39:02


是考研辅导书王道(操作系统)中关于信号量的一个题,个人觉得答案有精简的余地,所以讨论了一下,但是和王道高分牛校学长讨论的结果不满意,所以贴出来再探讨一下。

 

有一座桥,南北向,都有入口出口。(图我不画了)

1.假设该桥上每次只能有一辆车行驶,试用信号灯的PV操作实现交通管理。

2.假设该桥上不允许两车交会,但允许同方向多个车一次通过(即桥上可有多个同方向行驶的车)。试用信号灯的PV操作实现桥上交通管理。

 

课本参考答案

int countSN=0;

int countNS=0;

semaphore mutexSN=1;

semaphore mutexNS=1;

semaphore bridge=1;

StoN(){

p(mutexSN);

if(countSN==0)

p(bridge);

countSN++;

V(mutexSN);

过桥;

p(mutexSN);

countSN--;

if(countSN==0)

V(bridge);

v(mutexSN);

}

 

NtoS(){

p(mutexNS);

if(countNS==0)

p(bridge);

countNS++;

V(mutexNS);

过桥;

p(mutexNS);

countNS--;

if(countNS==0)

V(bridge);

v(mutexNS);

}

 

首先肯定一下这个代码的实现,这个好处是可读性强,易于理解,坏处就是太臃肿,不够精简,对于无法玩转的人,他对这个事情的认识会浮于表面的文字标识。但是我想探讨的更精简,或者说是比较本质比较核心的部分:

 

我的疑问就是,答案中countSNcountNS,可不可以用一个count,一是试探其可行性,二是觉得用两个count臃肿。

我都强调了,bridge信号量可以实现互斥,count减到0才能换方向,不然一方一直霸占bridge信号量,当换方向时,count又是从0开始,可以满足另一方向的计数要求。如此往复。

 

网上某童鞋跟我说不可以,但是没有逻辑上的说服力。

对话如下:

 

我:

如题,看答案似乎有些臃肿,因为同时只能NtoS或者StoN,也就是说换方向时count都会是0,那么还有必要用countSNcountNS两个计数吗?还是我逻辑不好,遗漏了什么?主要是想知道这个,是不是我什么没考虑到。

哈工大高玩:

  题目中说只能允许同时一个方向通车,这里使用两个计数器就是为了这里来考虑 ,如若使用一个,则会出现两个方向都有车辆通过的情况。

我:

如果是这样,那要bridge有什么用

哈工大高玩:

你还是没有理解我说的意思,brige是用来让两个方向同时只有一个再通车,但是假设像你说的那样,把countsn countns都用一个count来表示,表面上看好像也是说的通,但是这里就有一个问题了,countsn countns本来是用作对两个方向的车辆计数的,如果用一个,如何计数,计数不清楚,你怎么做到由南向北到要北向南通车的转变。其实我觉得这本身就需 要两个计数器来为两个方向计数,怎么能简化成一个呢。

 

 

我估计,他的想法无外乎几个角度,

一是说:他觉得我想的太简单,南和北count怎么能一样呢?那不就计算乱了,原来countSNcountNS分别代表南北方向的通车,如果不分用两个信号量,南北就无法互斥了~~~从字面来看,他确实是这样想的。

 

二是说:他认为那个countSN或者countNS本身就是那些过桥的车辆了,而我想的是,这两个只是信号量而已,区别过桥的到底是南到北还是北到南,其实是StoN()和NtoS()方法来决定的,countSNcountNS本身没有任何意义,不能代表南北方向的实际车辆,其实质只是一个计数工具, 这个工具是干什么的,很显然,是为了帮助控制bridge信号量的,根据count来完成两个if语句,占有bridge和释放bridge,既然 bridge信号量只能等到count==0才能转变给另一个进程,那么两个进程就是互斥的,count不可能同时为两边计数,也就是说可以用来重复利 用,这是我的想法,我认为逻辑上现在还找不出问题。

 

反正觉得他的想法对~!因为我无法理解我错在哪了,请不要说是可读性的问题。。。

是人的沟通障碍还是立场差异太大,不做太多吐槽,如果是我错了也好,希望有导师指正,帮我进步。

 

阅读(2500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~