2011-05-08 3 views
2

C의 세마포어를 사용하여 Reader-Writer의 문제에 대한 간단한 해결책을 작성했습니다. 그러나 모든 성공적인 실행 후에 다른 출력을 얻고 있습니다. 이것의 정확한 이유는 무엇입니까? 여기 코드는 다음과 같습니다리더 작성자 문제 : 매번 다른 출력 얻기

#include<stdio.h> 
#include<semaphore.h> 
#include<pthread.h> 
#include<string.h> 

sem_t x,wsem; 
int rc; 

void *reader(void *); 
void *writer(void *); 

int svar=0; 

int main() 
{ 
    pthread_t w[2],r[3]; 
    sem_init(&x,0,1); 
    sem_init(&wsem,0,1); 

    rc=0; 

    pthread_create(&w[0],NULL,writer,(void *)0); 
    pthread_create(&r[0],NULL,reader,(void *)0); 
    pthread_create(&w[1],NULL,writer,(void *)1); 
    pthread_create(&r[1],NULL,reader,(void *)1); 
    pthread_create(&r[2],NULL,reader,(void *)2); 

    pthread_join(r[0],NULL); 
    pthread_join(w[0],NULL); 
    pthread_join(w[1],NULL); 
    pthread_join(r[1],NULL); 
    pthread_join(r[2],NULL); 

    sem_destroy(&x); 
    sem_destroy(&wsem); 

    return 0; 
} 

void *reader(void *arg) 
{ 

     printf("\nReader is executing......"); 
     sem_wait(&x); 
     rc++; 
     if (rc == 1) 
     sem_wait(&wsem); 
     sem_post(&x); 
     printf("Reader-%d : value of shared variable : %d\n", (int)arg,svar); 
     sem_wait(&x); 
     rc--; 
     if (rc==0) 
      sem_post(&wsem); 
     sem_post(&x); 

} 

void *writer(void *arg) 
{ 

     printf("\nWriter is executing......"); 
     sem_wait(&wsem); 
     svar=svar+5; 
     printf("Writer-%d : value of shared variable : %d\n",(int)arg,svar); 
     sem_post(&wsem); 

} 

Output1 : 
Writer is executing......Writer-0 : value of shared variable : 5 

Reader is executing......Reader-0 : value of shared variable : 5 

Reader is executing......Reader-1 : value of shared variable : 5 

Writer is executing......Writer-1 : value of shared variable : 10 

Reader is executing......Reader-2 : value of shared variable : 10 

Output2: 

Writer is executing......Writer-0 : value of shared variable : 5 

Writer is executing......Writer-1 : value of shared variable : 10 

Reader is executing......Reader-1 : value of shared variable : 10 

Reader is executing......Reader-0 : value of shared variable : 10 

Reader is executing......Reader-2 : value of shared variable : 10 

Output3: 

Writer is executing......Writer-0 : value of shared variable : 5 

Writer is executing......Writer-1 : value of shared variable : 10 

Reader is executing......Reader-1 : value of shared variable : 10 

Reader is executing......Reader-0 : value of shared variable : 10 

Reader is executing......Reader-2 : value of shared variable : 10 
+0

코드를 다시 포맷하십시오. 포함물이 올바르게 표시되지 않습니다. –

+0

@Robin Green : 완료. –

+2

@skaffman : 왜 이것을 C++에 다시 추가 했습니까? 질문 자체는 그가 C를 사용하고 있으며'stdio.h '는 C 헤더이며 C++ 헤더는 아니라고 말합니다. –

답변

5

스레드 실행이 비 결정적이다. 특정 순서로 스레드를 시작했다고해서 순서대로 실행되지는 않습니다. 이 경우 세마포어와 조건 변수를 구조화 한 방법은 첫 번째 작성자가 작성한 후에 하나 이상의 작성자가 작성하거나 하나 이상의 독자가 특정 순서없이 읽을 수 있음을 의미합니다.