1. 程式人生 > >讀寫自旋鎖

讀寫自旋鎖

自旋鎖的衍生鎖讀寫自旋鎖(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);