2011-05-08 68 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

請重新格式化您的代碼 - 包括沒有正確顯示 – 2011-05-08 13:43:00

+0

@Robin綠色:完成。 – 2011-05-08 13:43:26

+2

@skaffman:你爲什麼把這個重新命名爲C++?問題本身說他使用C,'stdio.h'是C頭,而不是C++頭。 – 2011-05-08 13:45:38

回答

5

線程執行具有不確定性。僅僅因爲你已經按照特定的順序啓動了線程並不意味着它們將按照該順序執行。在這種情況下,您構建信號量和條件變量的方式意味着,一旦第一個作者寫入,則一個或多個作者可以寫入,或者一個或多個讀者可以讀取,而不是按特定順序。