讀寫自旋鎖
阿新 • • 發佈:2018-11-12
自旋鎖的衍生鎖讀寫自旋鎖(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);