Scala:屏障同步是如何实现的?

发布于 2024-10-27 10:08:45 字数 245 浏览 1 评论 0原文

任何人都知道如何在 ?我猜它正在使用信号量,但我想知道它到底是如何工作的,有人知道吗?

我想一种天真的想法可能是为每个进程创建一组信号量。有更好/更有效的实施吗?

anyone has any idea how is Barrier Synchronization implemented internally in ? I am guessing it is using Semaphores, but I am wondering how exactly it works, does anyone know?

I guess one naive way to think of this might be to create an array of Semaphores one for each process. Any better / more efficient implementations?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

荭秂 2024-11-03 10:08:45

我会使用 java.util.concurrent.CountDownLatch 或 java.util.concurrent.CyclicBarrier。

I'd use either java.util.concurrent.CountDownLatch or java.util.concurrent.CyclicBarrier.

醉殇 2024-11-03 10:08:45

好吧,对不起这些人,我终于找到了。以防万一有人感兴趣。

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

Ok, sorry for this guys, I have found it after all. here it is in case anyone is interested.

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;
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文