信号量实现读写锁

21 篇文章 0 订阅

/*

 * 一般的读写锁:

 * 一般的读写锁都是一开始对锁分配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;

 * 将这两个操作都放在一个数组里,就可以实现原子的先判断,再操作的效果了

 *

 * */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值