Let's go!!!!!
分类: LINUX
2015-07-23 14:27:00
Linux内核中最常见的锁是自旋锁。自旋锁最多只能被一个可执行线程占有。如果一个执行线程试图获得一个被已经持有的自旋锁,那么该线程就会一直进行忙循环——等待锁重新可用。
自旋锁基本使用形式:
DEFINE_SPINLOCK(mr_lock);
spin_lock(&mr_lock);
/*临界区*/
spin_unlock(&mr_lock);
自旋锁可用在中断处理程序中使用。在中断处理程序中使用自旋锁时,一定要在获取锁之前,禁止本地中断。自旋锁在中断中的使用形式
DEFINE_SPINLOCK(mr_lock);
unsigned long flags;
spin_lock_irqsave(&mr_lock,flags);
/*临界区*/
spin_lock_irqrestore(&mr_lock,flags);
读—写自旋锁
一个或多个读任务可以并发的持有读者锁;相反,用于写的锁最多只能被一个任务持有,而且此时不能有并发的读操作(写时不能读)。
读—写自旋锁基本使用形式:
DEFINE_RWLOCK(mr_rwlock);
read_lock(&mr_rwlock);
/*临界区 只读*/
read_unlock(&mr_rwlock);
write_lock(&mr_rwlock);
/*临界区 读写*/
write_unlock(&mr_rwlock);
在使用Linux读—写自旋锁时,最后要考虑一点是这种锁机制照顾读比照顾写多一点。当读锁被持有时,写操作为了互斥访问只能等待,但是,读者却可以继续成功的占有锁。而自旋锁等待的写者在所有读者释放锁之前是无法获取得到的(读时不能写)。