首页 > 学院 > 开发设计 > 正文

自旋锁

2019-11-10 17:27:13
字体:
来源:转载
供稿:网友

自旋锁(Spin lock)

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:    1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。    2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。       自旋锁的用法如下:   首先定义:spinlock_t x; 然后初始化:spin_lock_init(spinlock_t *x);   //自旋锁在真正使用前必须先初始化 在2.6.11内核中将定义和初始化合并为一个宏:DEFINE_SPINLOCK(x)      获得自旋锁:spin_lock(x);   //只有在获得锁的情况下才返回,否则一直“自旋”                           spin_trylock(x);  //如立即获得锁则返回真,否则立即返回假      释放锁:spin_unlock(x);


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表