3

我一直在阅读“信号量小书”,在第 41 页有一个解决可重用障碍问题的方法。我遇到的问题是为什么它不会产生死锁情况。

1 # rendezvous
2
3 mutex.wait()
4     count += 1
5     if count == n:
6         turnstile2.wait() # lock the second
7         turnstile.signal() # unlock the first
8 mutex.signal()
9
10 turnstile.wait() # first turnstile
11 turnstile.signal()
12
13 # critical point
14
15 mutex.wait()
16     count -= 1
17     if count == 0:
18         turnstile.wait() # lock the first
19         turnstile2.signal() # unlock the second
20 mutex.signal()
21
22 turnstile2.wait() # second turnstile
23 turnstile2.signal()

在这个解决方案中,在第 15 行和第 20 行之间,在持有会导致死锁的互斥体时在信号量(第 18 行)上调用 wait() 不是一个坏习惯吗?请解释。谢谢你。

4

1 回答 1

4

mutex保护count变量。第一个互斥锁涉及增加计数器以考虑每个线程,最后一个进入的线程 ( if count == n) 锁定第二个 tunstile 以准备离开(见下文)并释放等待的 (n-1) 个线程在第 10 行)。然后每个信号都向下一个发出信号。

第二个互斥锁的工作方式与第一个类似,但递减count(相同的互斥锁保护它)。最后一个进入互斥锁块的线程turnstile为下一批进入做准备(见上文)并释放在第 22 行等待的 (n-1) 个线程。然后每个线程向下一个发出信号。

因此turnstile将入口协调到临界点,同时turnstile2协调从临界点的出口。

不可能有死锁:当(最后一个)线程到达第 18 行时,turnstile保证不会被任何其他线程持有(它们都在第 22 行等待)。同样与turnstile2

于 2012-04-16T05:11:10.867 回答