在之前的部落格中我們說明了生產者消費者模型,在這篇部落格中我們討論類似的模型讀者寫者模型。
讀者寫者模型是作業系統的一種同步與互斥機制,與生產者消費者模型相似,區別在於多個讀者可以共享緩衝區,但是對於寫者而言相互是競爭關係,一次只能有乙個寫者,寫入緩衝區。
讀者優先:讀者先進行讀資料,寫者暫時阻塞,直到緩衝區中無資料,寫者訪問倉庫。
寫者優先:寫者先進行寫資料,讀者暫時阻塞,直到緩衝區中滿資料,讀者訪問倉庫。
公平情況:讀者寫者優先順序相同,誰先進優先順序佇列,誰先執行。
我們使用讀寫鎖實現讀者寫者模型,讀寫鎖和mutex相似,一共有三種狀態,讀模式下加鎖,寫模式下加鎖,解鎖。
在同一時間中,只能有乙個執行緒申請寫鎖,但是有多個執行緒申請讀鎖。
寫加鎖狀態:當處於寫加鎖狀態,所有申請鎖的程序都會阻塞。
讀加鎖狀態:處於讀加鎖狀態,申請讀模式下的鎖的程序都能獲得訪問,但是對於申請寫模式下的鎖的程序受到阻塞。
當讀寫鎖處於讀模式下,有程序申請寫模式的讀寫鎖會導致,之後的申請讀模式的讀寫鎖的程序遭到阻塞,原因是防止讀模式長期占用資源,導致寫程序飢餓。遞迴鎖也叫可重入鎖(reentrant mutex),非遞迴鎖也叫不可重入鎖(non-reentrant mutex)。
二者唯一的區別是:
同乙個執行緒可以多次獲取同乙個遞迴鎖,不會產生死鎖。
如果乙個執行緒多次獲取同乙個非遞迴鎖,則會產生死鎖。
設定讀寫優先
int
pthread_rwlockattr_setkind_np
(pthread_rwlockattr_t *attr,
int pref);/*
pref 共有三種引數
pthread_rwlock_prefer_reader_np 讀者優先,可能會導致寫者飢餓。
pthread_rwlock_prefer_writer_np 寫者優先
pthread_rwlock_prefer_writer_nonrecursive_np 寫者優先,但是不能遞迴加鎖
*/
初始化
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_rdlock(pthread_rwlock_t *rwlock)
;int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
;int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
;
//
#include
#include
#include
#include
#include
#include
using namespace std;
volatile
int ticket =
1000
;pthread_rwlock_t rwlock;
class threadattr
;void
*reader
(void
* arg)
printf
("%s:%d\n"
, id, ticket)
;pthread_rwlock_unlock
(&rwlock)
;sleep(1
);}return nullptr;
}void
*writer
(void
* arg)
printf
("%s:%d\n"
, id,
--ticket)
;pthread_rwlock_unlock
(&rwlock)
;sleep(1
);}return nullptr;
}string create_reader_id
(std:
:size_t i)
string create_writer_id
(std:
:size_t i)
void
init_readers
(vector
& vec)
}void
init_writers
(vector
& vec)
}void
join_thread
(vector
const
& vec)
}void
init_rwlock()
intmain()
Linux 讀者寫者模型
前面我們已經學過了生產者消費者模型,那本文就來介紹乙個與它有些相似卻又不同的讀者寫者模型。乙個資料檔案或記錄可以被多個程序共享,我們把只要求讀檔案的程序稱為reader程序,其他程序則被稱為write程序。允許多個程序同時讀乙個共享物件,但是不允許乙個write程序和其他reader程序或write...
讀者寫者模型
一 讀者寫者模型 讀者 唯讀資料區中的資料 寫者 只往資料區中寫資料 要求 1 允許多個讀者同時執行讀操作 2 不允許讀者 寫者同時操作 3 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...
讀者 寫者模型
一.讀者 寫者模型 我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他性 另一種情況就是讀操作,在讀操作中可以有多個資源併發的去訪問某種資源,它的訪問方式是共享的。一般由於寫端操作次數少,讀端操作次數多,因此寫端的優...