1. 如果一个非抢占的单处理器系统进入一个锁上的自旋, 它将永远自旋; 没有其他的线程再能够获得CPU 来释放这个锁. 因此, 自旋锁在没有打开抢占的单处理器系统上的操作被优化为什么不作;
2. 持有所的代码(临界代码),必须原子性的,即它不能睡眠,否则系统可能完全死锁。
3. 持有自旋锁时禁止中断
4. 不管是信号量还是自旋锁,都不允许第2次请求锁(在临界代码中调用另外一个函数,而这个函数也请求同一个锁)
自旋锁API
--加锁API----
void spin_lock(spinlock_t *lock);
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); //禁止中断,flags 记录中断
void spin_lock_irq(spinlock_t *lock); //
void spin_lock_bh(spinlock_t *lock)//禁止软件中断,硬件中断还是打开
--对应的释放API----
void spin_unlock(spinlock_t *lock);
void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags);
void spin_unlock_irq(spinlock_t *lock);
void spin_unlock_bh(spinlock_t *lock);
一套非阻塞的自旋锁操作:
int spin_trylock(spinlock_t *lock);
int spin_trylock_bh(spinlock_t *lock);
这些函数成功时返回非零( 获得了锁 ), 否则 0. 没有"try"版本的禁止中断的自旋锁.
解锁
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);
写自旋锁:
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); //
解锁
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);