对于约会问题,我们需要同步两个线程,这里有一个经典的解决方案:
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(其他线程对称):
while(true) {
doSomething();
aArrived.signal();
aArrived.signal();
bArrived.wait();
cArrived.wait();
}
我找到的所有资料都只是简单地陈述了以下内容:“再次考虑第3.2节中的会面问题。我们提出的解决方案的局限性在于它无法处理超过两个线程。” 或者“之前提出的解决方案对于多于两个线程是无效的。”。
(顺便说一句,本文介绍的通用解决方案可能并不是最佳的,因为对于N个线程,它需要使用N个信号量……我只是好奇是否有人有一个关于N>2线程的情景使该解决方案无法工作?)