读写自旋锁

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/83959858

自旋锁的衍生锁读写自旋锁(rwlock)可允许读的并发。读写自旋锁是一种比自旋锁粒度更小的锁机制,它保留了“自旋”的概念,但是在写操作方面,只能最多有1个写进程,在读操作方面,同时可以有多个读执行单元。当然,读和写也不能同时进行。

1.定义和初始化读写自旋锁

rwlock_t my_rwlock;
rwlock_init(&my_rwlock); /* 动态初始化 */

2.读锁定
 

void read_lock(rwlock_t *lock);
void read_lock_irqsave(rwlock_t *lock, unsigned long flags);
void read_lock_irq(rwlock_t *lock);
void read_lock_bh(rwlock_t *lock);

3.读解锁
 

void read_unlock(rwlock_t *lock);
void read_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void read_unlock_irq(rwlock_t *lock);
void read_unlock_bh(rwlock_t *lock);

在对共享资源进行读取之前,应该先调用读锁定函数,完成之后应调用读解锁函数。
read_lock_irqsave()、 read_lock_irq()和
read_lock_bh()也分别是read_lock()分别与
local_irq_save()、 local_irq_disable()和
local_bh_disable()的组合,读解锁函数
read_unlock_irqrestore()、 read_unlock_irq()、
read_unlock_bh()的情况与此类似。

4.写锁定
 

void write_lock(rwlock_t *lock);
void write_lock_irqsave(rwlock_t *lock, unsigned long flags);
void write_lock_irq(rwlock_t *lock);
void write_lock_bh(rwlock_t *lock);
int write_trylock(rwlock_t *lock);

5.写解锁
 

void write_unlock(rwlock_t *lock);
void write_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void write_unlock_irq(rwlock_t *lock);
void write_unlock_bh(rwlock_t *lock);

write_lock_irqsave()、 write_lock_irq()、
write_lock_bh()分别是write_lock()与local_irq_save()、
local_irq_disable()和local_bh_disable()的组合,写解锁函
数write_unlock_irqrestore()、 write_unlock_irq()、
write_unlock_bh()的情况与此类似。

在对共享资源进行写之前,应该先调用写锁定函数,完成之后应调用写解锁函数。和spin_trylock()一样,write_trylock()也只是尝试获取读写自旋锁,不管成功失败,都会立即返回。
读写自旋锁一般这样被使用:

实例代码:

rwlock_t lock; /* 定义rwlock */
rwlock_init(&lock); /* 初始化rwlock */
/* 读时获取锁*/
read_lock(&lock);

 /* 临界资源 */

read_unlock(&lock);
/* 写时获取锁*/

write_lock_irqsave(&lock, flags);

/* 临界资源 */

write_unlock_irqrestore(&lock, flags);

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/83959858