此题为计算17级A卷真题。
1. 变量及初值
信号量:
mutex=1 // 东西方向互斥
sem_ew=1 // 东向西使用计数变量互斥
sem_we=1 // 西向东使用计数变量互斥
整型变量:
count_ew=0 // 东向西的已上桥人数
count_we=0 // 西向东的已上桥人数
1. 每次只允许一个人过桥
P(mutex)
过桥
V(mutex)
2. 同方向可以同时过桥
独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。此问题与读者-写者问题中的读者类似。
从东向西:
P(sem_ew)
IF (count_ew=0) {
P(mutex)
}
count_ew += 1
V(sem_ew)
过桥
P(sem_ew)
count_ew -= 1
IF (count_ew=0) {
V(mutex)
}
V(sem_ew)
从西向东:
P(sem_we)
IF (count_we=0) {
P(mutex)
}
count_we += 1
V(sem_we)
过桥
P(sem_we)
count_we -= 1
IF (count_we=0) {
V(mutex)
}
V(sem_we)
3. 东西方向可以同时过桥
当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。其实是上面两种情况的综合。
此问题和读者与写者问题相同,东向西的为读者,西向东的为写者。
从东向西的,和2相同:
P (sem_we)
IF (count_we=0) {
P(mutex)
}
count_we += 1
V(sem_we)
过桥
P(sem_we)
count_we -= 1
IF (count_we=0) {
V(mutex)
}
V(sem_we)
从西向东的和1相同:
P(mutex)
过桥
V(mutex)
4. 交替通行
在1的基础上,加上同步,假设东向西方向先通行,
sem_sync_ew = 1 // 东西方向可通行
sem_sync_we = 0 // 西东方向不可通行
东向西方向:
P(sem_sync_ew)
P(mutex)
过桥
V(mutex)
V(sem_sync_we)
西向东方向
P(sem_sync_we)
P(mutex)
过桥
V(mutex)
V(sem_sync_ew)
潜在问题:
- 东西方向没人,西东方向有人,按上面的解法,西东方向不可通行,显然不合理