Linux 讀者寫者模型

2021-09-29 04:19:31 字數 2778 閱讀 2048

在之前的部落格中我們說明了生產者消費者模型,在這篇部落格中我們討論類似的模型讀者寫者模型

讀者寫者模型是作業系統的一種同步與互斥機制,與生產者消費者模型相似,區別在於多個讀者可以共享緩衝區,但是對於寫者而言相互是競爭關係,一次只能有乙個寫者,寫入緩衝區。

讀者優先:讀者先進行讀資料,寫者暫時阻塞,直到緩衝區中無資料,寫者訪問倉庫。

寫者優先:寫者先進行寫資料,讀者暫時阻塞,直到緩衝區中滿資料,讀者訪問倉庫。

公平情況:讀者寫者優先順序相同,誰先進優先順序佇列,誰先執行。

我們使用讀寫鎖實現讀者寫者模型,讀寫鎖和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 不允許多個寫者同時操作。我們知道在一些程式中存在讀者寫者問題,就是對某些資源的訪問會存在兩種可能的情況 一種就是寫操作,寫操作是可以獨佔資源的,也就是具有排他...

讀者 寫者模型

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