找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 3721|回复: 0
收起左侧

Linux内核的同步机制之三--读写自旋锁

[复制链接]
ID:107189 发表于 2016-3-5 23:39 | 显示全部楼层 |阅读模式
                        -写自旋锁(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
如果写和读不能清楚分开的话,那么最好就使用一般的自旋锁

           

回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表