2016-06-11 3 views
1

생산자/소비자 응용 프로그램을 만들려고합니다. 문제는 제 제작자가 전체 버퍼를 채우는 것입니다. 그러면 소비자가 전체 버퍼를 제거하고 있습니다 ... 생산자가 세마포어에 post을 작성하자마자 버퍼에서 항목을 제거한다고 가정하지 않았습니까?C에서 sempahore로 제작자 및 소비자 작업

내 코드 :

void* producerFunc(void* arg) 
{ 
    while(n_insertions < N_PRODUCTS) 
    { 
     sem_wait(&sem_postAvaliable); 
     sem_wait(&mutex); 
     //Insert Item 
     sem_post(&mutex); 
     sem_post(&sem_posTaken); 
    } 
    pthread_exit(NULL); 
} 

void* consumerFunc(void* arg) 
{ 
    while(n_consumed < N_PRODUCTS) 
    { 
     sem_wait(&sem_posTaken); 
     sem_wait(&mutex); 
     //Remove from bufer 
     sem_post(&mutex); 
     sem_post(&sem_postAvaliable); 
    } 
    pthread_exit(NULL); 
} 

n_insertions 버퍼에 삽입 된 항목의 수를 계산하는 글로벌 정수이고;

n_consumed은 소비자가 버퍼에서 항목을 소비 한 횟수를 계산하는 전역 정수입니다.

+2

세마포어 sem_postAvaliable 및 sem_posTaken을 어떤 값으로 초기화합니까? 또한,'pthread_mutex_t'를 사용하여 뮤텍스를 선언 한 다음'pthread_mutex_lock'과'pthread_mutex_unlock'을 사용하여 해당 뮤텍스를 잠금 해제하고 잠글 수 있습니다. – OiciTrap

+0

@cursillosonline sem_postAvaliable은 내 버퍼의 크기 인 5로 설정됩니다. sem_posTaken은 버퍼 공간이 아직 없기 때문에 0으로 초기화됩니다. pthread_mutex_lock로 확인하겠습니다 (큰 차이는 없습니까?) – PlayHardGoPro

답변

3

매우 높은 수준에서 sem_post(&sem_posTaken)을 수행하면 소비자는 "안녕하세요. 당신이 소비 할 수 있습니다"라고 말했지만 프로세서 스케줄러에 따라 생산자는 세마포어 카운터가 작동하지 않을 때까지 계속 생산할 수 있습니다 소비자를 허용하지 않으므로 생산자가 무언가를 삽입 한 직후 또는 어쩌면 3 개의 삽입 이후에 소비자가 소비 할 수 있습니까? 카운터가 0 인 세마포어의 sem_wait을 만들려고하면 스레드가 차단됩니다.

삽입과 제거를 번갈아 가며 사용하려면 sem_postAvaliable에서 1으로 초기화하십시오. 먼저, 다른 스레드가 sem_post(&sem_postAvaliable)을 기다리는 것을 막을 것이기 때문에 한 소비자가 버퍼에 삽입 한 내용을 소비 할 수 있지만이 경우에는 1보다 큰 크기의 버퍼는 의미가 없습니다.

+0

내 코드가 맞습니까? OMG – PlayHardGoPro

+1

물론 최소한 코드의 해당 부분에는 아무 것도 보이지 않습니다. – OiciTrap

+0

나는 그것이 전체 버퍼를 채우고 거의 모든 버퍼를 한 번에 비우는 것이 뭔가 잘못되었다는 신호라는 사실을 알고있다. – PlayHardGoPro