可重复使用的屏障解决方案有死锁?

时间:2012-04-16 04:55:09

标签: deadlock semaphore reusability barrier

我一直在阅读“信号量小书”,在第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()不是一个坏习惯吗?请解释。谢谢。

1 个答案:

答案 0 :(得分:4)

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

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

因此turnstile将条目与临界点进行协调,而turnstile2则协调它的出口。

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

类似