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