讀者-寫者問題(Reader-Writer Problem)
阿新 • • 發佈:2018-12-31
一、讀者---寫者問題(Reader-Writer Problem)
允許多個程序同時讀一個共享物件,因為讀操作不會使資料檔案混亂。但不允許一個Writer程序和其他Reader程序或Writer程序同時訪問共享物件,這樣訪問會引起混亂,此時讀或寫的區域就相當於一份臨界資源。
所謂“讀者-寫者問題”是指保證一個Writer程序必須與其他程序互斥地訪問共享物件的同步問題。
對於訪問區域這份臨界資源就要通過鎖來保護起來,任一時刻對區域進行的操作不會使資料檔案混亂導致出錯,即要保證臨界資源的原子性。
二、讀寫鎖(rwlock) 讀寫鎖實際是一種特殊的自旋鎖(自旋不斷做同一件事情來詢問當前狀態是否處於就緒狀態 )。
寫者優先,只有有資料才能讀取。
三、三種關係 1. 讀者與讀者 共享 共享關係,比如藝術廊裡有一個畫板,有一個畫家在上面畫了一幅畫,對於觀賞者來說,每個人都可以看,沒有什麼順序要求。
2.讀者與寫者 互斥 同步 互斥 假設畫板可擦除,則在畫家畫的時候觀賞者就看不了,而在觀賞者看得時候,畫家就不能在上面作畫。 同步 按某種特定的順序訪問,只有畫板上有畫觀賞者才會去觀賞,寫者優先。
3.寫者與寫者 互斥 任何時間只能有一個畫家在畫板上作畫。 四、讀寫模型與消費者生產者模型的區別: 消費者與生產者模型與讀寫模型最大不同是 對資料操作不同,在生產者與消費者模型中如果一個消費者把一個資源購買或使用,其他消費者就看不到這份資源,在讀寫模型 中,讀者與讀者是資源共享關係,而生產者消費者模型中,消費者與消費者是互斥關係。
五、程式碼演示
在Linux 下,test.c的內容
二、讀寫鎖(rwlock) 讀寫鎖實際是一種特殊的自旋鎖(自旋不斷做同一件事情來詢問當前狀態是否處於就緒狀態
三、三種關係 1. 讀者與讀者 共享 共享關係,比如藝術廊裡有一個畫板,有一個畫家在上面畫了一幅畫,對於觀賞者來說,每個人都可以看,沒有什麼順序要求。
2.讀者與寫者 互斥 同步 互斥 假設畫板可擦除,則在畫家畫的時候觀賞者就看不了,而在觀賞者看得時候,畫家就不能在上面作畫。 同步 按某種特定的順序訪問,只有畫板上有畫觀賞者才會去觀賞,寫者優先。
3.寫者與寫者 互斥 任何時間只能有一個畫家在畫板上作畫。 四、讀寫模型與消費者生產者模型的區別: 消費者與生產者模型與讀寫模型最大不同是 對資料操作不同,在生產者與消費者模型中如果一個消費者把一個資源購買或使用,其他消費者就看不到這份資源,在讀寫模型
Makefile 建立test.c 與test之間的關係#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); }
test:test.c
gcc -o [email protected] $^ -pthread
.PHONY:clean
clean:
rm -f test
通過對myread()、mywrite()函式中sleep()時間的改變,會得到不同的結果。