让我们考虑以下伪代码:
class OneBuf{
Mutex m;
CondVar cv;
int buffer;
bool full;
void put(int data){
m.lock();
while(full){
cv.wait(m);
}
buffer = data;
full = true;
cv.signal();
m.unlock();
}
int get(){
int data;
m.lock();
while(!full){
cv.wait(m);
}
full = false;
data = buffer;
cv.signal();
m.unlock();
return data;
}
}
我被告知上面的代码是容量为一个整数的缓冲区的错误实现,而第14和26行应该执行 cv.broadcast()而不是 cv。信号()即可。您是否可以通过显示执行初始代码以及 3个线程(例如1个生产者和2个消费者)来创建死锁(即所有3个线程最终都处于休眠状态)来帮助我证明此更正是必要的?
我不知道是否需要图论来证明这一点。
答案 0 :(得分:0)
如果应用程序处于一个消费者在监视器中并且另外两个线程正在等待它的状态,则仅发出一个线程的信号可能会唤醒另一个消费者,当缓冲区现在为空时,该消费者将被阻止。
由于被阻止的消费者没有发出信号,生产者不会醒来。缓冲区为空时,第一个消费者最终将被阻止。
一条路径以一个空缓冲区(两个消费者都在等待)和生产者有两个要放入缓冲区的项目开始。然后,在第二次放置时它将被阻止,其中一个消费者将进入。