問題聲明如下:瞭解ReusableBarrier問題(從「小書信號燈的」)
通常一組協作的線程將執行一系列循環步驟和 在屏障每一步後同步。對於這個應用程序,我們需要一個可重用的 屏障,在所有線程通過後自行鎖定。
定解決方案是:
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()
假設我們使用這一屏障,爲2個線程,我們通過這個屏障泵100個線程。當第二線程已解鎖旋轉門(7),併到達線9,現在,螺紋3沿過來,
它遞增計數,
計數>Ñ所以它釋放互斥,
由於旋轉門被解鎖它達到臨界點也
同樣,線程4,線程5,線程6可以執行臨界點,執行超過2次。
什麼阻止他們穿過線2前方的障礙物?或者我的理解在這裏錯了?
在這種情況下,我們設置障礙,預計2個線程,那就是它應該通過讓兩個線程,當第二個到達,直到第四個到達它應該阻止第三個。所以如果我們通過它抽取100個線程,它應該允許成對的線程穿過它。 然而,在上面的例子中,我認爲這將打破,並讓所有的線程,如果通過第二線程行號睡9 – sachin 2011-05-11 04:12:04
另外,併發的興趣郵件列表上的討論後,似乎人們期望,在這本書的例子是,通過同一組N個線程在一個循環中使用屏障。它不是一個通用屏障,可以被多組N個線程使用... – sachin 2011-05-11 04:15:56
正確。這聽起來像你想到的是一個屏障,允許線程進入關鍵部分只有三個批次,並要求三個退出前承認未來三。在這種情況下,我認爲你會喜歡第5章。有這樣的問題。 – 2011-05-20 23:44:42