读写锁的应用

  1. 在并发的方式中有读-读并发、读-写并发和写-写并发三种,很显然,一般的
    读操作并不会修改它的值(对某些读清零的硬件寄存器除外),因此读和读
    之间是完全允许并发的。但是使用自旋锁,读操作也会被加锁,从而阻止了
    另外一组读操作。为了提高并发的效率,必须降低多的粒度,以允许读和读
    之间的并发。
    为此内核提供了一种允许读和读并发的锁,叫读写锁,其数据类型
    rwlock_t,常用的API如下:
rwlock_init(lock)

read_trylock(lock)
write_trylock(lock)

read_lock(lock)
write_lock(lock)

read_lock_irq(lock)
read_lock_irqsave(lock,flags)
read_lock_bh(lock)

write_lock_irq(lock)
write_lock_irqsave(lock,flags)
write_lock_bh(lock)

read_unlock(lock)
write_unlock(lock)

read_unlock_irq(lock)
read_unlock_irqrestore(lock,flags)
read_unlock_bh(lock)

write_unlock_irq(lock)
write_unlock_irqrestore(lock,flags)
write_unlock_bh(lock)
下面是一个实例:
int i = 5;
unsigned long flags;
rwlock_t lock;

/*使用之前先初始化读写锁*/
rwlock_init(&lock);

/*要改变变量的值之前先获取写锁*/
write_lock_irqsave(&lock,flags);
i++;
write_unlock_irqrestore(&lock,flags);

int v;
/*只是先获取变量的值先获取读锁*/
read_lock_irqsave(&lock,flags);
v = i;
read_unlock_irqrestore(&lock,flags);
  1. 读写锁的使用也需经历定义、初始化、加锁、解锁的过程,只是要改变变量
    的值需要先获取写锁,值改变完成之后再解除写锁,读操作则用读锁。这样,
    当一个内核执行路径在获取变量的值时,如果有另一条执行路径也要来获取变量的值,则读锁可以正常获得,从而另一条路也能正常获取
    变量的值。但如果有另外一个写在进行,那不管是写锁还是读锁都不能获得,
    只有当写锁释放以后才可以。很明显,使用读写锁降低了锁的粒度,即对锁
    的控制更加精细了,从而获得了更高的并发性,带来了更高的工作效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值