自旋锁和互斥锁的区别是,自旋锁不会引起睡眠,所以可用于不能休眠的代码中(如IRQ)

自旋锁保持期间抢占失效,而信号量保持期间可以被抢占

定义

spinlock_t lock;

init

#define spin_lock_init(_lock)               \
do { \
spinlock_check(_lock); \
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)

获得

static inline void spin_lock(spinlock_t *lock)
static inline int spin_trylock(spinlock_t *lock)

spin_lock:获得锁以后,立即返回,否则,它将自旋在那里,直到该自旋锁的保持者释放

spin_trylock:获得锁失败,立即返回假

释放

static inline void spin_unlock(spinlock_t *lock)

举例

spinlock_t lock;
spin_lock_init(&lock)
...
critical section
...
spin_unlock(&lock)

其他

尽管自旋锁可以保证临界区不受别的CPU和本CPU抢占进程打扰,但是得到锁的代码在执行临界区的时候,还可能受到中断和底半部的影响

static inline void spin_lock_irq(spinlock_t *lock)
#define spin_lock_irqsave(lock, flags)
static inline void spin_lock_bh(spinlock_t *lock)
static inline void spin_unlock_irq(spinlock_t *lock)
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
static inline void spin_unlock_bh(spinlock_t *lock)

spin_lock_irq() = spin_lock() + local_irq_disable()

spin_lock_irqsave() = spin_lock() + local_irq_save()

spin_lock_bh() = spin_lock() + local_bh_disable()

spin_unlock_irq() = spin_unlock() + local_irq_enable()

spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()

spin_unlock_bh = spin_unlock() + local_bh_enable()

local_irq_disable:关中断

local_irq_save:关中断并保存状态字

local_bh_disable:关底半部

local_irq_enable:开中断

local_irq_restore:开中断并恢复状态字

local_bh_enable:开底半部

在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢占

spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的

spin_lock_irqsave

  1. 保存本地中断状态
  2. 关闭本地中断
  3. 获取自旋锁

spin_unlock_irqrestore

  1. 释放锁
  2. 恢复本地中断

:读写自旋锁待补充

最新文章

  1. HR人力资源战略流程制定
  2. 【java】由equals和==的区别引出的常量池知识
  3. IIS7程序发布后 之 报图表处理程序配置 [c:\TempImageFiles\] 中的临时目录无效
  4. <audio>使用2
  5. J2SE知识点摘记(四)
  6. 关于方法的ref
  7. ROS探索总结(十六)——HRMRP机器人的设计
  8. 怎么避免在类实现的cpp文件中不要多次进行类声明
  9. mysql 原理 ~ redo
  10. day 48-css-part1
  11. Docker Kubernetes 高可用架构设计
  12. grafna与饼状图
  13. mxnet:背景介绍
  14. Apache本地配置虚拟域名
  15. node学习笔记_02 API详解
  16. C#编程(十三)----------方法重载
  17. 破解 jeb 2.3.7 demo
  18. 记开发个人图书收藏清单小程序开发(三)DB设计
  19. Tensorflow-slim 学习笔记(二)第一层目录代码解读
  20. oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)

热门文章

  1. spring.factories spring.schemas spring.handlers spring自动装配
  2. 复制centos 后不能上网,处理办法
  3. java日期格式转换大全
  4. ["Visual Studio快捷键" ,"Vs","IDEA快捷键"]
  5. 'object ''/usr/local/lib/libdns.so'' from /etc/ld.so.preload cannot be preloaded: ignored.'
  6. 【论文阅读】3DMM-A Morphable Model for The Synthesis of 3D Faces
  7. QT+OPENCV实现录屏功能
  8. war包部署在tomcat下,使用windows service服务方式启动tomcat服务器,在包含调用dll的模块,报dll找不到问题的解决办法
  9. Linux 就该这么学 CH02新手必须掌握的Linux命令
  10. 【常用技巧】标准模板库(STL)