訊號量實現讀寫鎖

2021-06-17 17:10:44 字數 863 閱讀 3207

/*

* 一般的讀寫鎖:

* 一般的讀寫鎖都是一開始對鎖分配max_resource個資源,其中寫操作的時候會一次性占用

* max_resource個資源,而讀操作的時候就只會占用乙個資源。這樣子會出現乙個問題就是

* 如果在當前資源的數目不為max_resource的時候,那麼總是不能進行寫操作,只能是進行

* 讀操作,如果不停的有讀操作的話,那麼就無法進行寫操作,那麼就是出現俗稱的"寫餓死"

* 狀態,這也是讀優先鎖的問題所在。

** 寫優先讀寫鎖:

* 先說明一下,寫優先讀寫鎖會有兩把鎖的存在:互斥鎖(a)、資源鎖(b)

* 在進行占用資源的時候:

** 讀操作:

* 會先判斷a是否上鎖了,是的話等待直到解鎖為止,若沒有上鎖則對b進行加鎖(鎖乙個資源給)操作。

** 寫操作:

* 會判斷a是否上鎖,是的話等待直到解鎖為止,若沒有則對a進行加鎖操作,然後對b進行加鎖

* 操作(鎖max_resource個資源)操作

** 具體實現原理:

* 有乙個值得去注意的地方:

* 就是怎麼能夠實現判斷互斥鎖是否被占用,讀操作是不用鎖互斥鎖的,只是要判斷互斥鎖是否

* 被鎖住了。那麼就不能用一般的semop增減資源操作了。在這裡的話可以取巧的使用semop(0)即

* 對指定的訊號量占用0個資源的操作(如果占用0個資源,這個操作要等待到資源給為0時才返回)。

* 這樣我們就可以運用一對原子操作:

* 1、semop[0] :op = 0;

* 2、semop[1] :op = -1;

* 將這兩個操作都放在乙個陣列裡,就可以實現原子的先判斷,再操作的效果了

*

Linux Posix訊號量 讀寫鎖

posix訊號量 sem t sem init int sem init sem t sem,int pshared,unsigned int value 引數 pshared 0表 示執行緒間共享,非零表 示程序間共享 value 訊號量初始值 sem wait 條件不滿足,等待 sem post...

張氏讀寫鎖,c 訊號量實現

readwritelock.h pragma once includeclass readwritelock readwritelock.cpp include stdafx.h include readwritelock.h readwritelock readwritelock void m r...

利用條件訊號量設計讀寫鎖

1 乙個資源同時可以有多個讀寫,但是只能有乙個寫鎖 2 用flag代表鎖的狀態,define un lock 0 define r lock 1 上一把讀鎖加乙個r lock define w lock 1 偽 1 lock r pthread lock resource.mutex while r...