1.问题描述:东西方向人过独木桥,为了保证安全,只要桥上无人,则允许一方的人过桥并且过桥人数不能超过1个,待一方的人全部过完后,另一方的人才允许过桥,。
2.问题解题:
int eastcount =0; //当前从东边已上桥的人数
int westcount =0; //当前从西边已上桥的人数
semaphore bright=1; // 互斥信号量,表示独木桥的互斥访问
semaphore eastMutex =1; //东边的人想上桥,主要目的提示作用
semaphore westMutex =1; //西边的人想上桥,主要目的提示作用
East(){ //东边的人
while (true){ //循环
p(eastMutex); //东边的有人表示想上桥
if(eastcount==0) //判断桥上是否有东边上桥人
p(bright); //如果没有人,则申请桥资源,使西边想上桥的不能申请到桥资源
eastcount ++; //桥的从东边已上桥的人数+1
v(eastMutex); //释放东边想上桥
//过桥
p(eastMutex); //下桥时,表明东边已上桥人想下桥
eastcount --; //桥从东边已上桥的人数-1
if (eastcount==0) //判断桥上从东边上桥的人是否已经全部下桥了
v(bright); //如果下桥的人下完了,则释放桥资源
v(eastMutex); //释放东边已上桥的人
}
}
West(){ //西边的人
while (true){ //循换
p(westMutex); //西边的有人表示想上桥
if(westcount==0) //判断桥上是否有西边上桥人
p(bright); //如果没有人,则申请桥资源,使西边想上桥的不能申请到桥资源
westcount ++; //桥的从西边已上桥的人数+1
v(westMutex); //释放西边想上桥
p(westMutex); //下桥时,表明西边已上桥人想下桥
westcount --; //桥从西边已上桥的人数-1
if (westcount==0) //判断桥上从西边上桥的人是否已经全部下桥了
v(bright); //如果下桥的人下完了,则释放桥资源
v(westMutex); //释放西边已上桥的人
}
}