讀者寫者模型是作業系統中的一種同步與互斥機制,與生產者消費者模型類似,但不同的是在生產者消費者模型中,多個讀者間沒有關係,而且消費者會讓臨界資源的個數減少,而讀者不會改變臨界資源的個數。
讀者寫者模型應該具備的條件
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 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...
讀者 寫者模型
一.讀者 寫者模型 我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性 另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。一般由於寫端操作次數少,讀端操作次數多,因此寫端的優...
讀者寫者模型
讀者寫者模型 對於一塊公共資源來說,讀取的頻率比較高,但是寫的頻率很低.通常而言,在讀的過程中,往往伴隨著查詢的操作,中間消耗著大量的時長,如果給這種 加鎖,就會極大的降低我們的效率.所以在讀的時候是不需要加鎖的,大家共享公共資源,但是不會修改,那麼就不存在資料讀錯的問題.但是當有人要寫這個資料的時...