问答题 请用信号量解决以下的“晕独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待,当某一方向无人过桥时,另一方向的行人可以过桥。

【正确答案】A.B表示两个方向;
countA、countB表示A、B方向上已在独木桥上行人数;
SA用来实现对countA的互斥访问,初值为1;
SB用来实现对countB的互斥访问,初值为1;
mutex用来实现两个方向的行人对独木桥的互斥使用,初值为1。
A方向的行人:
wait(SA);
if(countA=0)then wait(mutex);
countA=countA+1
signal(SA);
通过独木桥;
walt(SA);
countA=countA-1:
if(countA=0)then?signal(mutex);
signal(SA);
B方向的行人:
wait(SB);
if(countB=0)then wait(mutex);
countB=countB+1
signal(SB);
通过独木桥;
wait(SB):
COLmtB=countB=1:
if(countB=0)then?signal(mutex);
signal(SB);
【答案解析】同步与互斥的解题思路
互斥问题要设置互斥信号量,不管有互斥关系的进程有几个或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允许一个进程对临界资源访问。
同步问题要设置同步信号量,通常同步信号量的个数与参与同步的进程种类有关,即同步关系涉及几类进程,就有几个同步信号量。同步信号量表示该进程是否可以开始或该进程是否已经结束。找出进程之间的同步关系,并为每种同步关系设置一信号量,然后再在需要等待某种动作的地方插入P操作,在被等待的动作完成之后插入V操作。
在每个进程中用于实现互斥的PV操作必须成对出现;用于实现同步的PV操作也必须成对出现,但可以分别出现在不同的进程中;在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P操作,但V操作的顺序没有严格要求。