2011-05-08 59 views
0

問題聲明如下:瞭解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前方的障礙物?或者我的理解在這裏錯了?

回答

1

問題語句指示(第22頁):

你可以假設有N個線程,並且這個值存儲在 變量,N,即從所有線程訪問。

因此,如果n = 2並且有100個線程,則違反了這個假設,解決方案將無法工作。

+0

在這種情況下,我們設置障礙,預計2個線程,那就是它應該通過讓兩個線程,當第二個到達,直到第四個到達它應該阻止第三個。所以如果我們通過它抽取100個線程,它應該允許成對的線程穿過它。 然而,在上面的例子中,我認爲這將打破,並讓所有的線程,如果通過第二線程行號睡9 – sachin 2011-05-11 04:12:04

+0

另外,併發的興趣郵件列表上的討論後,似乎人們期望,在這本書的例子是,通過同一組N個線程在一個循環中使用屏障。它不是一個通用屏障,可以被多組N個線程使用... – sachin 2011-05-11 04:15:56

+0

正確。這聽起來像你想到的是一個屏障,允許線程進入關鍵部分只有三個批次,並要求三個退出前承認未來三。在這種情況下,我認爲你會喜歡第5章。有這樣的問題。 – 2011-05-20 23:44:42

0

也許這超出了這個問題,但這裏有雲:上市的解決方案是,據我可以告訴正確的,只要最多n個線程的屏障代碼中。保證這一點的一種方式是總共只有n個線程。

書中還介紹了確保只有N個線程在給定區域內以不同的方式:複用(使用信號量,以保證最多n個線程同時使用一個給定的資源)。使用這樣的:

general_barrier.init(n): 
    occupancy = Semaphore(n) 
    barrier = Barrier(n) 
general_barrier.enter(): 
    occupancy.wait() 
    barrier.enter() 
    barrier.leave() 
general_barrier.leave(): 
    occupancy.signal() 

你會使用這樣的:

shared state: 
    gbarrier = general_barrier(n) 
each of m threads (where m > n, but in particular try m > 2*n): 
    while True: 
     gbarrier.enter() 
     something critical 
     gbarrier.leave() 

在問題的代碼,你可以把occupancy.wait()上線2和occupancy.signal()上線24,並有基本上是這樣的解。請注意,問題中的代碼在臨界點之後放置了相當於barrier.leave()的值,即general_barrier.leave(),而不是之前的值,因爲我已經完成了該操作。我認爲這對於正確性並不重要,儘管在執行上下文切換的次數方面可能很重要。也許,在某些情況下。讀者自由裁量權建議;-)