Псевдокод для «неадекватной реализации» проблемы производителя, упомянутый в wikipedia, приведен ниже. Говорят, что это решение имеет условие гонки, которое может вызвать тупик.Многопоточное программирование - производитель Потребитель
Мой вопрос: не только изменил бы условия пробуждения другой нити, как ниже, разрешив возможную проблему взаимоблокировки. Таким образом, существует не только одно пробуждение, которое может быть потеряно, но и последующие несколько, или я что-то упускаю. Попытка понять здесь.
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);
}
}
Также все строки, которые изменяют 'itemCount', должны быть атомарными или заблокированными. – Adam
Просто исправлено это @Adam. Благодарю. – Gray
В случае с несколькими потребителями-производителями не следует посылать пробуждения во все темы? Таким образом, можно избежать гонки? – goldenmean