自旋锁跟互斥锁有点类似,加锁时,如果锁变量没有被占用,则加锁成功,继续下面的代码,不同的是,如果失败,自旋锁会一直循环检查锁变量是否可用,互斥锁是线程被阻塞,可以看到,锁变量不可用时,自旋锁会一直占用CPU,而互斥锁不会。
自旋锁适合于等待时间非常短的情况,它可以在任何上下文使用(进程上下文,中断上下文)。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,因为信号量会阻塞进程,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。
自旋锁定义/初始化/使用/销毁代码如下:
#include <linux/spinlock.h>
spinlock_t spinlock=SPIN_LOCK_UNLOCKED;//静态初始化
动态初始化的方式:
spinlock_t spinlock;
spin_lock_init(spinlock);
spin_lock(spinlock);
对自旋锁进行加锁,如果能够获得锁,则立马加锁,如果获取不到,则在原地旋转,知道能获得锁。
spin_unlock_wait(spinlock);
等待自旋锁不被任何执行单元保持,如果没有任何单元保持该自旋锁,则立即返回,否则将循环在哪里直到自旋锁被释放。
spin_trylock_wait(spinlock);
尽力获得自旋锁,如果能够立即获得返回真,不能立即获得返回假,并不在原地等待。
spin_lock_irqsa