内核中常用的同步原语使用说明
在可以休眠的地方,一般使用mutex或semaphore, 不可以休眠的地方一般用spinlock(自旋锁)
mutex/semaphore: 可以在无法进入临界区的时候进入休眠状态, 一般不能用在中断或其他异步上下文中
使用:
DEFINE(mutex); mutex_lock() / mutex_unlock()
spinlock: 在无法进入临界区的时候就一直在那不停的获取锁, 一般用在不能休眠的地方, 因此甚至内核里在使用spinlock的时候都会禁止CPU的抢占调度方式, 总之,适用于spinlock的核心规则是: 任何拥有spinlock的代码都必须是原子的, 使用规则: 1) 不能休眠, 2) 如果spinlock同时也被中断上下文使用则应获取锁的时候关闭中断, 3) spinlock必须在尽可能短的时间内完成.
使用:
spinlock_t my_lock; spin_lock_init(); spin_lock()/spin_lock_irqsave()/ spin_lock_irq() / spin_lock_bh(); spin_unlock()/spin_unlock_irqrestore()/spin_unlock_irq()/spin_unlock_bh