나는 고전적인 생산자/소비자 문제가 있습니다. 생산자에 대한 코드는 이것이다 :배열 기반 바운드 버퍼의 빈 요소
#define BUFFER_SIZE 10
while (true) {
/* Produce an item */
while (((in + 1) % BUFFER_SIZE) == out)
; /* do nothing -- no free buffers */
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
}
그리고 소비자는 다음과 같습니다
while (true) {
while (in == out)
; // do nothing -- nothing to consume
// remove an item from the buffer
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
return item;
}
이 잘 작동하지만 문제는 처음 8 개 요소가 가득 in=9
및 out=0
때, 생산자가 앉아 있다는 것입니다 거기 마지막 (9) 요소를 채우지 않습니다. 이는 in=4
및 out=5
과 같은 경우에도 발생합니다. 하나의 슬롯이 여전히 비어 있더라도 하나의 요소는 항상 비어 있고 큐는 "가득"합니다.
몇 가지 복잡한 검사를 할 수 있지만 큐 전체를 채울 수있는 깨끗한 솔루션이 있는지 알아야합니다. 나는 처음에 증가를 시도한 다음 item
을 넣었지만 비슷한 문제가 발생합니다. (in
과 out
모두에 대해 -1
으로 초기화하는 것도 작동하지 않습니다.
이런 종류의 문제에 대해 준비가 잘되어 있고 잘 테스트 된 솔루션/라이브러리를 사용하지 않는 이유는 무엇입니까? – PlasmaHH
저는 사람들에게 그 라이브러리 중 하나를 만드는 법을 가르치 려하기 때문에. 따라서 "최고의 가능한 코드"에 대한 내 질문. 나는 내 자신의 마음/경험에서 나온 나쁜 습관을 학생들에게 가르치고 싶지 않습니다. SO 전문가의 의견을 구합니다. :) – recluze
아, 그리고 왜 내가 연결된 목록을 사용하지 않는지에 대한 이유 - 배열을 통해 어떻게 처리 할 수 있는지 가르쳐주고 싶기 때문입니다. – recluze