此题为计算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)

潜在问题:

  • 东西方向没人,西东方向有人,按上面的解法,西东方向不可通行,显然不合理
本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2023-05-10 10:44

results matching ""

    No results matching ""