我一直在读《The Little Book of Semaphores》,第 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() 会导致死锁,这不是一个坏习惯吗?请解释。谢谢。
mutex
保护count
多变的。第一个互斥锁涉及递增计数器以说明每个线程以及最后一个进入的线程(if count == n
)锁定第二个 tunstile 准备离开(见下文)并释放等待的 (n-1) 个线程(在第 10 行等待)。然后每个信号都向下一个发出信号。
第二个互斥锁的工作方式与第一个类似,但递减count
(相同的互斥体可以保护它)。最后进入互斥锁的线程turnstile
准备下一批进入(见上文)并释放第 22 行等待的 (n-1) 个线程。然后每个线程向下一个线程发出信号。
Thus turnstile
协调进入临界点的条目,同时turnstile2
协调从中退出。
不可能出现死锁:当(最后一个)线程到达第 18 行时,turnstile
保证不被任何其他线程持有(它们都在第 22 行等待)。类似地与turnstile2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)