关于应试学习指导书中激昂的鸡翅(操作系统)中信号量的问题,我个人认为还有简化答案的余地,所以进行了讨论,但是因为不喜欢和激昂的鸡翅高分牛学校前辈讨论的结果,所以贴上去重新考虑。
有一座桥。 南北有入口的出口。 (不画图) )。
1 .假设该桥一次只能行驶一辆车,尝试信号灯p、v操作实现交通管理。
2 .假设该桥不允许两辆车交叉,但允许同方向的多辆车同时通过(即桥上可以有多辆同方向行驶的车)。 尝试信号机的p、v操作实现桥面交通管理。
参考教科书的“答案”:
int countSN=0;
int countNS=0;
semaphore mutexSN=1;
semaphore mutexNS=1;
semaphore bridge=1;
StoN ()。
p(mutexsn );
if(countsn==0) ) ) )。
p (网桥);
计数;
v(mutexsn );
过桥;
p(mutexsn );
countsn----;
if(countsn==0) ) ) )。
v (网桥);
v(mutexsn );
}
NtoS () }
p(mutexns );
if (计数ns==0) ) ) ) )。
p (网桥);
计数Ns;
v(mutexns );
过桥;
p(mutexns );
计数NS-- -;
if (计数ns==0) ) ) ) )。
v (网桥);
v(mutexns );
}
首先,让我们肯定一下这个代码的实现。 这个好处是可读性强,容易理解。 缺点是过于肥大,没有简化。 对于不能去玩的人,他对这件事的认识会浮现在表面的文字标识上。 但我想探讨的是更合理或本质上更核心的部分:
我的问题是,在答案中countSN和countNS是否可以使用一个count。 一是探索其可能性,二是认为在两个计数上会肥大化。
虽然都强调了,bridge信号量可以实现互斥。 只有计数减少到0,才能重新定向。 否则,一方一直占领着bridge信号量。 转换方向后,count又从0开始,可以满足另一个方向的计数要求。 这样往返。
网上的一双童鞋对我说不行,但没有逻辑上的说服力。
对话如下。
我:
就像问题一样,从回答来看,好像有点肥大。 因为同时只能做NtoS或者StoN。 也就是说,如果改变方向,则count都为0。 那么,需要使用countSN和countNS两个计数吗? 还是我逻辑不好,忽略了什么? 我主要想知道这个,我什么都没想吗?
哈工大古玩:
主题中说只能同时单向开通,这里使用两个计数器是为了在这里考虑。 使用一个时,车辆可能会在两个方向上通过。
我:
如果是这样的话,bridge有什么用
哈工大古玩:
你还没明白我说的话。 brige是为了确保两个方向同时只开通一个,但假设你说的那样,用一个count来表示countsn和countns,表面上看起来是相通的,这里有一个问题。 countsn和countns原本是用来计数两个方向的车辆的。 如果有一个事实,我认为这本身是必要的
我需要两个计数器来计数两个方向,为什么能简化为一个?
我认为他的想法有几个角度,
一、他觉得我想得太简单了,南北count为什么一样? 那是不是计算混乱了? 原本countSN和countNS分别表示南北方向开通。 如果不区分使用两个信号量的话,南北就不能互斥了~~~正如文字所示,他确实是这么想的。
第二,他认为那个countSN或countNS本身就是过桥车辆,但我想的是,这两个只是信号量,区分过桥是从南到北还是南,其实是由StoN (和NtoS )的方法决定的,StoN
很明显,这个工具是为了帮助控制bridge信号量。 基于count完成两个if语句,占用bridge,释放bridge。 既然bridge信号量只能迁移到count==0的另一个进程,则两个进程是互斥的,count不能同时计数到两侧。 也就是说可以用于再利用
反正我觉得他的想法是正确的~! 我不理解我错在哪里,所以别说是可读性问题。
是人际沟通障碍,还是立场差异太大,我不会太吐槽,但如果我错了也没关系的话,希望有领导的指出,有所进步。