2016-11-24 2 views
2

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");  
} 
+0

20은/소비자 모델은 동시 접속을 대기. 문제의 정의에 대해 읽어보십시오. 당신은 단지 고정 된 버퍼를 동시에 채우고 읽을 수는 있지만 큐잉 시스템은 아닙니다. 어쨌든, 당신은 당신이 어떻게 멈추는 지 정의 할 필요가 있습니다. –

+0

디자인에 근본적인 결함이 있습니다. 각 소비자에게 메시지에 대한 별도의 끝 표식이 있어야합니다. 한 명의 소비자 만 읽을 수 있기 때문에 모든 사람에 대해 하나의 끝 표식을 가질 수는 없습니다. – Barmar

+0

나는 큐잉 시스템을 사용하지 않는다는 것을 알고 있지만, 배열 대신에 큐로 변경했다하더라도, 교착 상태는 여전히 존재하며, 모든 사람들을위한 끝 마커를 정의하는 방법은 무엇입니까? – pousT

답변

0

으로, 하나 이상의 터미네이터 (즉) 각 소비자를 보낼 필요가 : 여기 내 코드입니다. produce에서

은 변경 :

insert(buffer, '\0'); 

속으로 :

for (i=0; i<NUM_OF_CONSUMER; ++i) 
    insert(buffer, '\0'); 
0

분할 오류가 발생할 수 있습니다.

buffer 크기는 10 바이트이며 실제 20 바이트를 저장하고 있습니다.

변경 buffer 크기 프로듀서

#define BUFFER_SIZE 20 
+0

감사합니다. 방금 버퍼의 위치를 ​​결정하기 위해 out = (out + 1) % NUM_OF_INTEGER 대신 out = (out + 1) % BUFFER_SIZE를 사용해야한다는 것을 알았습니다 – pousT