1. 程式人生 > >讀者-寫者問題(Reader-Writer Problem)

讀者-寫者問題(Reader-Writer Problem)

一、讀者---寫者問題(Reader-Writer Problem)      允許多個程序同時讀一個共享物件,因為讀操作不會使資料檔案混亂。但不允許一個Writer程序和其他Reader程序或Writer程序同時訪問共享物件,這樣訪問會引起混亂,此時讀或寫的區域就相當於一份臨界資源。      所謂“讀者-寫者問題”是指保證一個Writer程序必須與其他程序互斥地訪問共享物件的同步問題。      對於訪問區域這份臨界資源就要通過鎖來保護起來,任一時刻對區域進行的操作不會使資料檔案混亂導致出錯,即要保證臨界資源的原子性。
二、讀寫鎖(rwlock)     讀寫鎖實際是一種特殊的自旋鎖自旋不斷做同一件事情來詢問當前狀態是否處於就緒狀態
)。
    寫者優先,只有有資料才能讀取。
三、三種關係     1. 讀者與讀者   共享        共享關係,比如藝術廊裡有一個畫板,有一個畫家在上面畫了一幅畫,對於觀賞者來說,每個人都可以看,沒有什麼順序要求。
    2.讀者與寫者   互斥 同步      互斥 假設畫板可擦除,則在畫家畫的時候觀賞者就看不了,而在觀賞者看得時候,畫家就不能在上面作畫。  同步 按某種特定的順序訪問,只有畫板上有畫觀賞者才會去觀賞,寫者優先。
    3.寫者與寫    互斥     任何時間只能有一個畫家在畫板上作畫。 四、讀寫模型與消費者生產者模型的區別: 消費者與生產者模型與讀寫模型最大不同是 對資料操作不同,在生產者與消費者模型中如果一個消費者把一個資源購買或使用,其他消費者就看不到這份資源,在讀寫模型
中,讀者與讀者是資源共享關係,而生產者消費者模型中,消費者與消費者是互斥關係。
五、程式碼演示  在Linux 下,test.c的內容
#include<stdio.h>
#include<pthread.h>
int book=0;
pthread_rwlock_t rwlock;
void *myread(void *arg)
{
    sleep(1);
    while(1)
    {
        if(pthread_rwlock_tryrdlock(&rwlock)!=0)
        {
            printf("writer is writing....!\n");    
        }
        else
        {
            printf("read book done!%d\n",book);    
            pthread_rwlock_unlock(&rwlock);
        }    
    }
}

void *mywrite(void *arg)
{   
    while(1)
    {
        if(pthread_rwlock_trywrlock(&rwlock)!=0)
        {
            printf("reader is reading...\n");    
        }
        else
        {
            book++;
            printf("writen book done:%d\n",book);
            //sleep(3);
            pthread_rwlock_unlock(&rwlock);
        }
    }
}

int main()
{
    pthread_t r,w;
    pthread_create(&r,NULL,myread,NULL);
    pthread_create(&w,NULL,mywrite,NULL);

    pthread_join(r,NULL);
    pthread_join(w,NULL);
}
Makefile 建立test.c 與test之間的關係
test:test.c
    gcc -o [email protected] $^ -pthread
.PHONY:clean
clean:
    rm -f test
通過對myread()、mywrite()函式中sleep()時間的改變,會得到不同的結果。