linux并发控制之自旋锁
来源:互联网 发布:mac lol美服安装教程 编辑:程序博客网 时间:2024/05/06 12:19
自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式。
通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为“我当前在运行,请等待”或者标记为“我当前不在运行,可以被使用”, 如果A执行单元首先获得锁,那么当B进入同一个例程时将获知自旋锁已被持有,需等待A释放后才能进入,所以B只好原地打转(自旋)。
特点:
1.自旋锁主要针对SMP或单CPU且内核可抢占的情况,对于单CPU且内核不可抢占的系统自旋锁退化为空操作
2.尽管自旋锁可以保证临界区不受别的CPU和本CPU的抢占进程打扰,但是得到锁的代码路径在执行临界区的时候还可能受到中断和底半部影响,此时应该使用 自旋锁的衍生操作
注意:
1.自旋锁实际上是等于忙等待锁,所以要求占用锁的时间极短
2.对于同一CPU或进程,不可递归使用自旋锁
3.自旋锁锁定期间不能调用可能引起进程调度的函数,比如,copy_from_user(),copy_to_user(), kmalloc(),msleep()
操作
定义于#include<linux/spinlock_types.h>
spinlock_t lock; //定义自旋锁
spin_lock_init(&lock); //初始化自旋锁
spin_lock(&lock); //如不能获得锁,原地打转。
spin_trylock(&lock); //尝试获得,如能获得锁返回真,不能获得返回假,不在原地打转。
spin_unlock(&lock); //与spin_lock()和spin_trylock()配对使用。
自旋锁衍生操作 = 自旋锁+ 中断屏蔽
spin_lock_irq()
spin_unlock_irq()
spin_lock_irqsave()
spin_unlock_irqrestore()
spin_lock_bh()
spin_unlock_bh()
用法:
spinlock_t lock; //定义自旋锁 --全局变量
spin_lock_init(&lock); //初始化自旋锁 --初始化函数中
spin_lock(&lock); // 获取自旋锁 --成对在操作前后使用
...临界区...
spin_unlock(&lock) //释放自旋锁
- linux并发控制之自旋锁
- linux并发控制之读写自旋锁
- linux并发控制之自旋锁
- linux并发控制之读写自旋锁
- linux并发控制之自旋锁
- linux并发控制之读写自旋锁
- Linux 设备驱动--- 并发 之- 自旋锁
- Linux 驱动之并发控制 (信号量、原子锁和自旋锁)
- linux设备驱动--并发与竞态之自旋锁
- 设备驱动-----并发控制--自旋锁
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- linux设备驱动并发控制--自旋锁和信号量应用区别
- Linux设备驱动中的并发控制,原子打操作、自旋锁、信号量、完成量、互斥体
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- Android深度探索:HAL与驱动开发学习笔记--并发控制之自旋锁
- Linux 内核中的并发--自旋锁
- linux多线程之自旋锁
- linux并发控制之完成量
- ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
- Log4Net 配置和使用
- 通过CopSSH 搭建git服务器
- [网络] TCP三次握手/四次挥手详解 2 补(转) [百度空间]
- linux并发控制之自旋锁
- 关于Scanner对象的nextLine()和next()的使用
- const
- 百度地图SDK for Android【覆盖物】
- linux并发控制之读写自旋锁
- 冬令营
- XP,win7下拿到完整路径名
- Python编写发送简单html邮件代码
- Java NIO vs. IO