Linux 讀者寫者模型

2021-08-18 20:08:18 字數 2147 閱讀 6112

前面我們已經學過了生產者消費者模型,那本文就來介紹乙個與它有些相似卻又不同的讀者寫者模型。

乙個資料檔案或記錄可以被多個程序共享,我們把只要求讀檔案的程序稱為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 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...

讀者 寫者模型

一.讀者 寫者模型 我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性 另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。一般由於寫端操作次數少,讀端操作次數多,因此寫端的優...