2011-03-28 32 views
0

任何人有任何想法Barrier Synchronization如何在內部實施?我猜測它使用的是Semaphores,但我想知道它的工作原理,有人知道嗎?Scala:Barrier同步是如何實現的?

我想一個天真的想法可能是爲每個進程創建一個Semaphores數組。任何更好/更有效的實現?

+0

當提到計算機科學中的一般術語時,通常將維基百科鏈接或描述該術語的其他權威機構鏈接起來很有幫助。 – 2011-03-28 14:55:09

回答

1

好的,對不起這個傢伙,我終於找到了。這裏是任何人有興趣的情況。

class Barrier(n:Int){ 
    assert(n>1); 
    private var waiting = 0; // number of processes currently waiting 
    private val waitSem = new Semaphore; waitSem.down 
    private val mutex = new Semaphore; 

    def sync = { 
    mutex.down; 
    if(waiting==n-1){ waitSem.up; } 
    else{ 
     waiting+=1; mutex.up; waitSem.down; 
     // Wait until woken 
     waiting-=1; 
     if(waiting==0) mutex.up; else waitSem.up; 
    } 
    } 
} 
1

我會使用兩種java.util.concurrent.CountDownLatchjava.util.concurrent.CyclicBarrier

+0

爲什麼你更喜歡那些以上的實施? – kxk 2011-03-28 15:01:22

+0

@devilwontcry由於三個原因:1)它們是標準接口,因此人們可能事先知道他們做了什麼,而不必去了解; 2)他們有充分的文件記錄; 3)它們經過了很好的測試,很可能沒有bug。例如,您的實現不會在任何地方同步,導致訪問「waiting」時可能出現爭用情況。寫它的方式,有可能「等待」永遠不會到達「n + 1」,也不會返回到「0」。查找CyclicBarrier的源代碼進行比較。 – 2011-03-28 17:24:06

+1

不不不不!我的實現是正確的100%。這就是'互斥體'在那裏的原因。它確保等待自動改變。 – kxk 2011-03-28 17:46:06