Scala: Как реализована барьерная синхронизация? - PullRequest
1 голос
/ 28 марта 2011

кто-нибудь знает, как Barrier Synchronization реализован внутри ? Я предполагаю, что он использует Semaphores, но мне интересно, как именно это работает, кто-нибудь знает?

Полагаю, одним наивным способом думать об этом может быть создание массива семафоров, по одному для каждого процесса. Есть ли лучшие / более эффективные реализации?

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Я бы использовал java.util.concurrent.CountDownLatch или java.util.concurrent.CyclicBarrier.

1 голос
/ 28 марта 2011

Хорошо, извините за это, ребята, я все-таки нашел это.здесь на всякий случай.

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;
    }
  }
}
...