维基百科中提到的生产者消费者问题的“实施不足”的伪代码如下。据说该解决方案具有可能导致死锁的竞争条件。
我的问题是:不只是修改唤醒另一个线程的条件如下解决可能的死锁问题。这样,不仅有一个可能会丢失的唤醒,而是后续的多个唤醒,或者我错过了什么。试图理解这里。
int itemCount = 0;
procedure producer() {
while (true) {
item = produceItem();
if (itemCount == BUFFER_SIZE) {
sleep();
}
putItemIntoBuffer(item);
itemCount = itemCount + 1;
//if (itemCount == 1) <<<<<<<< change this to below condition
if(itemCount > 0)
{
wakeup(consumer);
}
}
}
procedure consumer() {
while (true) {
if (itemCount == 0) {
sleep();
}
item = removeItemFromBuffer();
itemCount = itemCount - 1;
//if (itemCount == BUFFER_SIZE - 1) <<<<<<< Change this to below
if(itermCount < BUFFER_SIZE)
{
wakeup(producer);
}
consumeItem(item);
}
}