2011-03-28 31 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