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();