C로 단일 생산자 - 다중 소비자 프로그램을 구현하려고하는데 소비자의 '\ 0'문자를 사용하여 파일의 끝인지 여부를 확인합니다. . 그러나 다중 사용자가있을 때와 마지막 문자를 기다리는 경우 모두 하나가 임계 섹션에 들어 와서이 문자를 사용할 때 교착 상태가 발생합니다. 다른 언급생산자 - 소비자 C 프로그래밍의 교착 상태
void insert(char* buffer, char value){
printf("lock in insert %c\n", value);
sem_wait(&empty);
sem_wait(&mutex);
printf("insert %c\n",value);
buffer[in] = value;
in = (in+1) % BUFFER_SIZE;
sem_post(&mutex);
sem_post(&full);
}
char get(char* buffer) {
char item;
printf("lock in get\n");
sem_wait(&full);
sem_wait(&mutex);
item = buffer[out];
printf("comsume %c\n",item);
out = (out+1)%BUFFER_SIZE;
sem_post(&mutex);
sem_post(&empty);
return item;
}
void *produce(void *param) {
int i=0;
char randomChar;
for(i=0; i<NUM_OF_INTEGERS; ++i) {
randomChar = 'A' +random()%26;
insert(buffer, randomChar);
}
insert(buffer, '\0');
printf("produce finished\n");
}
void *consume(void *param) {
int i=0;
char data;
do{
data = get(buffer);
}while(data != '\0');
printf("consume finished\n");
}
20은/소비자 모델은 동시 접속을 대기. 문제의 정의에 대해 읽어보십시오. 당신은 단지 고정 된 버퍼를 동시에 채우고 읽을 수는 있지만 큐잉 시스템은 아닙니다. 어쨌든, 당신은 당신이 어떻게 멈추는 지 정의 할 필요가 있습니다. –
디자인에 근본적인 결함이 있습니다. 각 소비자에게 메시지에 대한 별도의 끝 표식이 있어야합니다. 한 명의 소비자 만 읽을 수 있기 때문에 모든 사람에 대해 하나의 끝 표식을 가질 수는 없습니다. – Barmar
나는 큐잉 시스템을 사용하지 않는다는 것을 알고 있지만, 배열 대신에 큐로 변경했다하더라도, 교착 상태는 여전히 존재하며, 모든 사람들을위한 끝 마커를 정의하는 방법은 무엇입니까? – pousT