读-写自旋锁(spinlock)

锁的用途可以明确地分为读和写。Linux提供了专门的读-写自旋锁。这种自旋锁为读和写分别提供了不同的锁。一个或多少任务可以并发地持有读取锁;而写入锁一次最多只能被一个任务持有,而且此时不能有并发的读操作。我们可以将读/写锁分别叫做共享(并发)/排斥锁 

读写锁的用法与一般自旋锁的用法相似。

初始化:rwlock_t  mr_rwlock = RW_LOCK_UNLOCKED;

在读取的代码中:

   read_lock(&mr_rwlock) ;

   /*临界区*/

   read_unlock(&mr_rwlock);

在写入的代码中:

   write_lock(&mr_rwlock);

   /*临界区*/

   write_unlock(&mr_rwlock);

通常情况下,读锁与写锁是分开写的。注意不能将一个读锁“Update”为写锁,如下面的代码将导致死锁

read_lock(&mr_rwlock);

write_lock(&mr_rwlock);

因为写锁要不断自旋,等待所有的读锁释放锁,当然也就包括它自己,但是它自己处在忙循环等待中,不能释放锁。所以当需要写操作时,一开始就应该请求写锁,要么先释放读锁,然后再申请写锁。

Linux 提供的读写自旋锁的方法如下:

read_lock()  获得指定的读锁

read_lock_irq() 禁止本地中断并获得指定的读锁

read_lock_irqsave()存储本地中断的当前状态,禁止本地中断并获得指定读锁

read_unlock() 释放指定的读锁

read_unlock_irq()释放指定的读锁并激活本地中断

read_unlock_irqrestore()释放指定的读锁并将本地中断恢复到指定的前状态

write_lock()  获得指定的写锁

write_lock_irq() 禁止本地中断并获得指定的写锁

write_lock_irqsave()存储本地中断的当前状态,禁止本地中断并获得指定写锁

write_unlock() 释放指定的写锁

write_unlock_irq()释放指定的写锁并激活本地中断

write_unlock_irqrestore()释放指定的写锁并将本地中断恢复到指定的前状态

writ_trylock() 试图获得指定的写锁,如果写锁不可用,返回非0

rw_lock_init()初始化指定的rwlock_t

rw_is_locked() 如果指定的锁当前已被持有,返回非0值,否则返回0

 

如果写和读不能清楚分开的话,那么最好就使用一般的自旋锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值