顺序锁

读不必等待写

写也不必等待读

写与写仍然是互斥

如果有写,其他写必须自旋,直到写释放了顺序锁

读操作要读两次,如果两次相等就会就不会继续读,不相等就继续读。

 

1.获得顺序锁
 

void write_seqlock(seqlock_t *sl);
int write_tryseqlock(seqlock_t *sl);
write_seqlock_irqsave(lock, flags)  //禁止中断,并将之前的中断屏蔽状态保存在flags中
write_seqlock_irq(lock)  //禁止中断
write_seqlock_bh(lock)  //禁止中断下半部

其中,
 

write_seqlock_irqsave() = loal_irq_save() + write_seqlock()
write_seqlock_irq() = local_irq_disable() + write_seqlock()
write_seqlock_bh() = local_bh_disable() + write_seqlock()

2.释放顺序锁
 

void write_sequnlock(seqlock_t *sl);
write_sequnlock_irqrestore(lock, flags)
write_sequnlock_irq(lock)
write_sequnlock_bh(lock)

其中,
 

write_sequnlock_irqrestore() = write_sequnlock() + local_irq_restore()
write_sequnlock_irq() = write_sequnlock() + local_irq_enable()
write_sequnlock_bh() = write_sequnlock() + local_bh_enable()

写执行单元使用顺序锁的模式如下:
 

write_seqlock(&seqlock_a);
.../* 写操作代码块 */
write_sequnlock(&seqlock_a);

因此,对写执行单元而言,它的使用与自旋锁相同。读执行单元涉及的顺序锁操作如下。

1.读开始

unsigned read_seqbegin(const seqlock_t *sl);
read_seqbegin_irqsave(lock, flags)

读执行单元在对被顺序锁s1保护的共享资源进行访问前需要调用该函数,该函数返回顺序锁s1的当前顺序号。其中,
 

read_seqbegin_irqsave() = local_irq_save() + read_seqbegin()

2.重读
 

int read_seqretry(const seqlock_t *sl, unsigned iv);//相等返回 0,不相等返回 1
read_seqretry_irqrestore(lock, iv, flags)

读执行单元在访问完被顺序锁s1保护的共享资源后需要调用该函数来检查,在读访问期间是否有写操作。如果有写操作,读执行单元就需要重新进行读操作。其中,
 

read_seqretry_irqrestore() = read_seqretry() + local_irq_restore()

读执行单元使用顺序锁的模式如下:

do {
seqnum = read_seqbegin(&seqlock_a);
/* 读操作代码块 */

//...

} while (read_seqretry(&seqlock_a, seqnum));

write_seqlock_irqsave(&lock, flags);
//写代码
write_seqlock_irqrestore(&lock, flags)

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值