Scala:如何实现屏障同步?

时间:2011-03-28 10:45:32

标签: scala concurrency semaphore

任何人都知道Barrier Synchronization内部Semaphores如何实施?我猜它正在使用{{1}},但我想知道它是如何工作的,有人知道吗?

我想一个想到这个的天真方式可能是为每个进程创建一个信号量数组。任何更好/更有效的实施?

2 个答案:

答案 0 :(得分:2)

我会使用java.util.concurrent.CountDownLatchjava.util.concurrent.CyclicBarrier

答案 1 :(得分: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;
    }
  }
}