ウィキペディアで言及されている生産者と消費者の問題の「不適切な実装」の擬似コードは次のとおりです。このソリューションには、デッドロックを引き起こす可能性のある競合状態があると言われています。
私の質問は次のとおりです。以下のように他のスレッドをウェイクアップする条件を変更するだけで、デッドロックの問題が解決するわけではありません。そうすれば、失われる可能性のあるウェイクアップが 1 つだけではなく、その後に複数のウェイクアップがあるか、何か不足しています。ここを理解しようとする。
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);
}
}