一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。 分析: ① 约束: a) 桥属于临界资源,两岸的人对该资源进行竞争; b) 桥上的人数是有限制的,设这个桥由N个桥墩构成,桥上同时只能有N个人过桥,其它人要进行等待。相当于共享资源数。写出算法
时间: 2024-01-22 17:20:38 浏览: 22
这是一个经典的并发同步问题,可以使用信号量实现。
假设岸上有两个队列A和B,分别表示从A岸和B岸出发要过桥的人。还有一个信号量mutex,用于保护桥这个临界资源的竞争。
算法步骤如下:
1. 初始时,mutex=1,A与B队列为空;
2. 每个人是一个进程,每个进程执行以下程序:
```
wait(A/B); //等待在自己所在的队列上
wait(mutex); //请求桥这个临界资源
//过桥
signal(mutex); //释放桥这个临界资源
signal(A/B); //离开队列
```
3. 当A岸上有人要过桥时,执行以下程序:
```
wait(mutex); //请求桥这个临界资源
while(桥上的人数已满){
signal(mutex); //如果桥上人数已满,释放桥这个临界资源
wait(A); //等待其他人离开桥
wait(mutex); //重新请求桥这个临界资源
}
//桥上人数未满,开始让人过桥
将前N个人从A队列取出,让他们过桥,然后放到B队列中
signal(mutex); //释放桥这个临界资源
```
4. 当B岸上有人要过桥时,执行以下程序:
```
wait(mutex); //请求桥这个临界资源
while(桥上的人数已满){
signal(mutex); //如果桥上人数已满,释放桥这个临界资源
wait(B); //等待其他人离开桥
wait(mutex); //重新请求桥这个临界资源
}
//桥上人数未满,开始让人过桥
将前N个人从B队列取出,让他们过桥,然后放到A队列中
signal(mutex); //释放桥这个临界资源
```
这样,就可以实现两个方向的人顺利过桥了。需要注意的是,上述算法可能导致饥饿问题,即某个方向的人一直无法过桥。为了解决这个问题,可以使用优先级队列来保证公平性。