自旋锁不关心临界区执行的是什么操作,不管读写都同等对待,即便多个执行单元同时读取临界资源也会被锁住。
实际上,对共享资源的并发访问时,多个执行单元同时读时没有问题的。读写自旋锁可允许读并发。
读写自旋锁是一种比自旋锁粒度更小的锁机制,在写的时候,只能最多有一个写进程,但是在读操作方面,可以允许同时有多个
读执行单元。但是读和写也不能同时进行。
定义读写锁:
rwlock_t rwlock;
读写锁初始化:
rwlock_init(&rwlock);
读锁定:
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);
读解锁:
void read_unlock(rwlock_t *lock);
void read_unlock_irqstore(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_disble以及
local_bh_enable()的结合,读解锁函数也是同样的。
写锁定:
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);
void write_trylock(rwlock_t *lock);
写解锁:
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);