Linux内核自旋锁使用笔记

Reference:
spin_lock_bh()与spin_unlock_bh()
Linux内核自旋锁
Linux自旋锁
Spinlock - Wikipedia, the free encyclopedia

本文地址:https://segmentfault.com/a/1190000005354100


原理

首先,spinlock是一把锁,它的功能与其他锁的作用类似,都是对用于临界区进行原子读写。使用这把锁时,原理上就是不停的循环检查锁的状态,直到可用的时候进入临界区。

与mutex的区别

Spinlock只进行虚幻检查,在内核中仍然允许抢占。
Mutex会立即引起调度,因而在一些中断处理函数中会出问题。

注意:
  由于是循环检查而已,因此临界区的大小应该限制,否则非常影响效率。
  选择自旋锁时,要注意考虑中断(软中断与硬中断;timer中断属于软中断)

函数和宏定义

头文件
#include <linux/spinlock.h>
静态初始化
spinlock_t a_lock = SPIN_LOCK_UNLOCKED;
宏定义和函数

动态初始化:

spin_lock_init(&a_lock);

判断自旋锁是否上锁:

spin_is_locked(&a_lock);

等待直到spinlock解锁

spin_unlock_wait(&a_lock);

进入和退出临界区

spin_lock(&a_lock);
spin_unlock(&a_lock);

保存状态寄存器值地进入和退出临界区

int flags;
spin_lock_irqsave(&a_lock, flags);
spin_unlock_irqrestore(&a_lock, flags);

屏蔽硬件中断地进入和退出临界区

spin_lock_irq(&a_lock);
spin_unlock_irq(&a_lock);

屏蔽底半部中断地进入和退出临界区

spin_lock_bh(&a_lock);
spin_unlock_bh(&a_lock);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值