|
#define BUFFER_SIZE 10
Typedefstruct {
.........
} item;
item buffer[BUFFER_SIZE];
intin = 0;
intout = 0;
여기서,in, out은0으로초기화된다. 버퍼들의공유저장소는두개의논리적인포인터인in과out를가진순환배열로구현된다. 변수in은버퍼내에서다음비어있는위치를, out는버퍼내에서첫번째차있는위치를가르킨다. In==out일때, 저장소는비어있는상태이며. ((In+1)%BUFFER_SIZE) == out이면퍼버(저장소)는가득차있는상태이다.
•생산자코드는nextProduced라는지역변수(local variable)에다음번생산되는item을저장하고있다.
item nextProduced;
while (1) {
/* produce an item in nextProduced*/
while (((in + 1) % BUFFER_SIZE) == out); /* do nothing */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
}
•소비자코드는nextConsumed라는지역변수에다음번소비될item을저장하고있다.
item nextConsumed;
while (1) {
while (in == out) ; /* do nothing */
nextConsumed= buffer[out];
out = (out + 1) % BUFFER_SIZE;
/* consume the item in nextConsumed*/ }
}
이방법은BUFFER_SIZE-1 까지만을버퍼에수용할수있다. 버퍼에최대BUFFER_SIZE개까지넣을수있는방법은추후에논한다.
위의 내용이구요 질문은 두가지입니다. 답변 부탁드려요!
질문1.Producer가 생성하지 않은 데이터를 Consumer가 꺼내갈수 있는가? 혹은 Consumer가 꺼내간 데이터가 Producer가 생성하지 않은 데이터일수 있는가? 그이유는 무엇인가?
질문2.여기서 N-1개의 슬롯이 사용가능하다 N개의 슬롯이 아닌 N-1개의 슬롯이 사용 가능한 이유는 무엇인가?
이 두가지 질문입니다. 정확한 답변 부탁드립니다.
|