Multithreading 为什么会合信号灯解决方案不';不能概括(我们用屏障代替)?

Multithreading 为什么会合信号灯解决方案不';不能概括(我们用屏障代替)?,multithreading,concurrency,synchronization,semaphore,barrier,Multithreading,Concurrency,Synchronization,Semaphore,Barrier,对于集合问题,我们需要同步两个线程,下面是一个经典的解决方案: aArrived = S(0); bArrived = S(0); 线程A: while(true) { doSomething(); aArrived.signal(); bArrived.wait(); } 线程B: while(true) { doSomething(); bArrived.signal(); aArrived.wait(); } 这对于两个线程来说效果很好,但是对于N个线程呢?对

对于集合问题,我们需要同步两个线程,下面是一个经典的解决方案:

aArrived = S(0);
bArrived = S(0);
线程A:

while(true) {
  doSomething();
  aArrived.signal();
  bArrived.wait();
}
线程B:

while(true) {
  doSomething();
  bArrived.signal();
  aArrived.wait();
}
这对于两个线程来说效果很好,但是对于N个线程呢?对于N=3,我们可以实现如下内容:

线程A(其他线程是对称的):

我找到的所有资料都表明:,或


(顺便说一句,这里介绍的通用解决方案可能不是最优的,因为它将为N个线程使用N个信号量……我只是好奇是否有人认为此解决方案不适用于N>2个线程?

如果在Java中使用
CyclicBarrier
,这将非常简单,因为它可以为您做这类事情。但对于一般情况,你会如何做到这一点,并自己写呢?您可以执行类似于
countdownlock
CyclicBarrier
的操作

保持预期参与方数量的计数,在他们接近屏障时将其递减,然后在递减的计数为0时通知所有人。例如:(这是难以置信的简化)

然后


在Java中也可以使用

CyclicBarrier#await();


什么语言?或者你问的是一般意义上的问题?我问这个问题的原因是,在Java中有一种简单的方法可以做到这一点。也许有更简单的方法可以做到这一点,但我只是想理解为什么泛化不起作用。。。有什么想法吗?:)嗨,约翰,谢谢你的回答!但我的问题是,试图理解为什么在《信号灯小书》这样的书中,作者说rendez-vous的解决方案不适用于超过2个线程。你知道为什么我问题中提出的解决方案不能概括吗?
class CountdownBarrier {
   private int numberOfParties;
   private final Object lock = new Object();
   public CountdownBarrier(int numberOfParties){ this.numberOfParties = ..}

   public void arriveAndAwait(){  
      synchronized(lock){  
         if(--numberOfParties == 0)
            lock.notifyAll();  
         while(numberOfParties != 0)
            lock.wait();       
      }
   }
} 
CountdownBarrier barrier = new CountdownBarrier(3);

Thread A:
   barrier.arriveAndAwait();
Thread B: 
   barrier.arriveAndAwait();
Thread C:
   barrier.arriveAndAwait(); // assuming time progresses downward, this arriveAndAwait will notify all threads to wake up and continue.
CyclicBarrier#await();
CountdownLatch#countDown(); // then
CountdownLatch#await();