用讀寫鎖實現 讀者寫者模型

2021-08-18 19:05:23 字數 2785 閱讀 1530

讀者寫者模型是作業系統中的一種同步與互斥機制,與生產者消費者模型類似,但不同的是在生產者消費者模型中,多個讀者間沒有關係,而且消費者會讓臨界資源的個數減少,而讀者不會改變臨界資源的個數

讀者寫者模型應該具備的條件

1.寫者是排他性的,即有多個寫者的情況下,只有乙個寫者占有倉庫。

2.讀者可以一起讀,採取並行機制。

3.讀者和寫者是同步且互斥的,如果讀者占有了倉庫,則寫者不能占有,若寫者正在寫,則讀者不能訪問倉庫。

讀者寫者模型的策略

1.讀者優先

讀者先來讀取資料,此時寫者處於阻塞狀態,當讀者讀取完資料後且沒有了讀者時寫者才能訪問倉庫。

2.寫者優先

寫者先寫入資料,此時讀者處於阻塞狀態,當寫者寫完資料後且沒有寫者時讀者才能訪問倉庫。

3.公平情況

寫者和讀者訪問倉庫的優先順序相等,誰先進入優先順序佇列誰先訪問。

自旋鎖與掛起等待鎖

1.自旋鎖

執行緒申請資源失敗時,它會一直在當前檢測鎖位置處輪尋鎖的狀態,來檢視資源是否能被申請。不斷檢測的過程叫做自旋,如讀寫鎖。

2.掛起等待鎖

執行緒申請資源失敗時,作業系統將其掛起等待,如互斥鎖和二元訊號量。

什麼是讀寫鎖?

讀寫鎖是一種特殊的自旋鎖,它把對共享資源的訪問者劃分為讀者和寫者,讀者只對共享資源進行讀訪問,寫者需對貢獻資源進行寫操作,這個鎖相對於自旋鎖而言,能提高併發性。原因是在多處理器系統中,允許同時有多個讀者來訪問共享資源,最大的讀者數量其實為實際的邏輯cpu數。寫者是排他性的,乙個讀寫鎖可以同時有乙個寫者或多個讀者,但不能同時既有讀者又有寫者。

讀寫鎖的狀態

1.寫加鎖狀態

當處於寫加鎖狀態,在被解鎖之前,所有試圖對鎖進行訪問的執行緒都會被阻塞,通俗來講,就是「只有自己可以進行寫,其他操作都不能進行」。

2.讀加鎖狀態

當處於讀加鎖狀態,所有試圖以讀模式對這個鎖進行訪問的執行緒都可以獲得訪問權,但是任何以寫模式對鎖進行訪問的執行緒都會被阻塞,直到所有的執行緒都釋放他們的讀狀態鎖為止。通俗來講,就是「只要執行緒是讀模式就可以訪問」。

讀寫鎖相關函式

1.初始化讀寫鎖&銷毀

引數:

attr表示初始化讀寫鎖的屬性,null為預設屬性。

2.讀加鎖函式

返回值:成功返回0,失敗返回錯誤碼。

注意:因為作業系統對讀者數量有限制,所以當我們使用讀加鎖函式時最好先判斷一下返回值。

3.寫加鎖函式

返回值:成功返回0,失敗返回錯誤碼。

pthread_rwlock_rdlock加鎖失敗則被掛起等待,pthread_rwlock_trylock加鎖失敗不掛起等待採用輪詢式等待。

4.解鎖函式

返回值:成功返回0,失敗返回錯誤碼。

對於讀加鎖和寫加鎖而言,解鎖函式相同。

**實現讀者寫者模型:

4個寫者執行緒,6個讀者執行緒。

#include 

#include

#include

#include

int count;

pthread_rwlock_t rwlock;

//write

void *writer(void *arg)

}//read

void *reader(void *arg)

}int main()

for(i=0;i<6;++i)

for(i=0;i<10;++i)

pthread_rwlock_destroy(&rwlock);

return

0;}

執行結果:

讀者寫者模型

一 讀者寫者模型 讀者 唯讀資料區中的資料 寫者 只往資料區中寫資料 要求 1 允許多個讀者同時執行讀操作 2 不允許讀者 寫者同時操作 3 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...

讀者 寫者模型

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

讀者寫者模型

讀者寫者模型 對於一塊公共資源來說,讀取的頻率比較高,但是寫的頻率很低.通常而言,在讀的過程中,往往伴隨著查詢的操作,中間消耗著大量的時長,如果給這種 加鎖,就會極大的降低我們的效率.所以在讀的時候是不需要加鎖的,大家共享公共資源,但是不會修改,那麼就不存在資料讀錯的問題.但是當有人要寫這個資料的時...