前面我們已經學過了生產者消費者模型,那本文就來介紹乙個與它有些相似卻又不同的讀者寫者模型。
乙個資料檔案或記錄可以被多個程序共享,我們把只要求讀檔案的程序稱為reader程序,其他程序則被稱為write程序。允許多個程序同時讀乙個共享物件,但是不允許乙個write程序和其他reader程序或writer程序同時訪問物件。因為這樣可能會造成混亂。所謂「讀者寫者問題」只是保證乙個writer程序必須與其他程序互斥地訪問共享物件的同步問題。
總結一下,也是」321「原則:
三種關係
(1)寫者與寫者:不能兩個人同時寫,所以互斥
(2)讀者與讀者:可以兩個人同時讀,所以沒有關係,也可以說是共享的
(3)寫者與讀者:乙個檔案不能又是被讀,又是被寫的,所以互斥;寫完了才能讀,不讀了才開始寫,所以說又是同步的。
兩種角色:讀者和寫者。
乙個讀寫場所。
讀者寫者模型的「321」原則,雖然與生產者消費者很類似,但是卻又不同。消費者是將資料帶拿走,而讀者則只是讀資料,資料還在,並沒有被拿走。這是兩者之間最大的不同。
有時候經常會出現公共資源修改的機會比較少,讀資源的機會比較多的情況,此時,就需要用到我們的讀寫鎖了。讀寫鎖是一種特殊的自旋鎖,能提高併發性。它允許多個多個讀者來訪問資源;寫者是排他性的,乙個讀寫鎖同時只能有乙個寫者或多個讀者,但不能同時既有讀者又有寫者。
如果讀寫鎖當前沒有讀者,也沒有寫者,那麼寫者可以立刻獲得讀寫鎖,否則它必須自旋在那,直到沒有任何寫者或讀者;反過來,如果讀寫鎖沒有寫者,那麼讀者就可以立刻得到讀寫鎖,否則,它要自旋知道寫者釋放讀寫鎖。
自旋鎖與互斥鎖比較類似,都是為了解決資源的互斥問題。對於互斥鎖來說,如果資源已經被占用,申請者只能掛起等待,直到被喚醒。自旋鎖則不會被掛起,它會一直迴圈著看鎖是否被釋放。
自旋鎖適用於占用臨界資源時間較短的時候,因為自旋鎖不會引起呼叫者睡眠,所以自旋鎖的效率高於互斥鎖。但是由於自旋鎖一直占用cpu,所以如果不能在短時間內獲得鎖,誰使用cpu效率下降。
注意:寫獨佔,讀共享,寫鎖的優先順序高
初始化:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
銷毀:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
加鎖:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//寫鎖
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//讀鎖
解鎖:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
下面我們寫**來使用一下讀寫鎖,以加深印象。
這裡使用執行緒來操作,建立三個寫的執行緒,五個讀的執行緒,這裡寫者優先順序高。
#include
#include
#include
#include
pthread_rwlock_t rwlock;
int count = 0;
void* route_write(void* arg)
}void* route_read(void* arg)
}int main()
for(i=3; i<8; i++)
for(i=0; i<8; i++)
pthread_rwlock_destroy(&rwlock);
return
0;}
執行結果:可以發現讀者出現的比較多,寫者出現的比較少。
Linux 讀者寫者模型
在之前的部落格中我們說明了生產者消費者模型,在這篇部落格中我們討論類似的模型讀者寫者模型。讀者寫者模型是作業系統的一種同步與互斥機制,與生產者消費者模型相似,區別在於多個讀者可以共享緩衝區,但是對於寫者而言相互是競爭關係,一次只能有乙個寫者,寫入緩衝區。讀者優先 讀者先進行讀資料,寫者暫時阻塞,直到...
讀者寫者模型
一 讀者寫者模型 讀者 唯讀資料區中的資料 寫者 只往資料區中寫資料 要求 1 允許多個讀者同時執行讀操作 2 不允許讀者 寫者同時操作 3 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...
讀者 寫者模型
一.讀者 寫者模型 我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性 另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。一般由於寫端操作次數少,讀端操作次數多,因此寫端的優...