当前位置: 首页 > news >正文

解决驱动开发中并发和竞争中的问题----------自旋锁

什么是自旋锁

是指临界区资源被持有锁线程A拥有的时候,别的线程B只能原地等待不会进入睡眠,直到A释放锁,那么A才可以访问临界区资源

注意:自旋锁一般是用在等待时间比较短的地方,如果等待时间较长的话一般考虑使用信号量

结构体:spinlock_t

在这里插入图片描述

相关API函数

下面的API是不考虑中断情况下的
在这里插入图片描述
主要是下面两个函数

获得锁函数 void spin_lock(spinlock_t *lock) 获取指定的自旋锁,也叫做加锁

解锁函数 void spin_unlock(spinlock_t *lock) 释放指定的自旋锁

注意:上面的自旋锁API函数适用于SMP或支持抢占的单CPU下线程之间的并发访问, 也就是用于线程与线程之间(不考虑中断),被自旋锁保护的临界区一定不能调用任何能够引起睡眠和阻塞的 API 函数,否则的话会可能会导致死锁现象的发生

注意发生死锁:
由于获得锁之后内核会自动禁止抢占,如果线程A进入睡眠的话就相当于放弃了CPU,那么此时B线程就会运行,此时B也想获得锁,但是线程A并没有释放掉锁,并且A由于禁止抢占式不能被唤醒,所以B只能在外面等待,所以就出现死锁

考虑中断的情况
如果线程之间来了个中断,又会是什么情况呢
在这里插入图片描述
线程 A 先运行,并且获取到了 lock 这个锁,当线程 A 运行程序的时候中断发生了,中断抢走了CPU 使用权。右边的中断服务函数也要获取 lock 这个锁, 但是这个锁被线程 A 占有着,中断就会一直自旋,等待锁有效。但是在中断服务函数执行完之前,线程 A 是不可能执行的,线程 A 说“你先放手”,中断说“你先放手”,场面就这么僵持着,死锁发生!

最好的解决方法就是获取锁之前关闭本地中断

即调用下面的函数获得锁即可
在这里插入图片描述

使用自旋锁一般步骤

在这里插入图片描述
在这里插入图片描述

注意事项:

在这里插入图片描述

总结:
1)自旋锁的使用可以在中断中,如果有中断的话必须使用考虑中断的API获得锁,不然会出现死锁,
2)自旋锁必须是等待时间比较短,因为自旋锁会一直占用CPU,如果需要等待长时间即进入睡眠的话那就考虑信号量,下面一篇介绍信号量
3)自旋锁不能使用睡眠或阻塞的相关函数

相关文章:

  • 【VIO】第1讲 IMU 传感器
  • 每日三题 9.30
  • C++ Reference: Standard C++ Library reference: C Library: cmath: llrint
  • NNDL实验: Moon1000数据集 - 弯月消失之谜
  • ROC-RK3588-PC 八核8K人工智能开源主板
  • 2022新版PMP考试有哪些变化?
  • hive集群加了个参数后,union all的任务都执行不了影响业务
  • 攻防演练中防守方的防护措施.
  • 鲁棒的非负监督低秩鉴别嵌入算法
  • 第一季:12Linux常用服务类相关命令【Java面试题】
  • 35-SpringBoot 短信验证码接口使用
  • RTOS 任务划分
  • 无人机基础知识:多旋翼无人机系统基本组成
  • uniapp原生插件-YL视频播放器
  • 黑马瑞吉外卖之套餐信息的删除
  • 时间复杂度分析经典问题——最大子序列和
  • Apache Zeppelin在Apache Trafodion上的可视化
  • ES6核心特性
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • java正则表式的使用
  • js对象的深浅拷贝
  • js中forEach回调同异步问题
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • ReactNative开发常用的三方模块
  • 测试如何在敏捷团队中工作?
  • 复习Javascript专题(四):js中的深浅拷贝
  • 技术胖1-4季视频复习— (看视频笔记)
  • 如何用vue打造一个移动端音乐播放器
  • 智能合约Solidity教程-事件和日志(一)
  • 阿里云ACE认证学习知识点梳理
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 回归生活:清理微信公众号
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​一些不规范的GTID使用场景
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (04)odoo视图操作
  • (13):Silverlight 2 数据与通信之WebRequest
  • (Java数据结构)ArrayList
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (九十四)函数和二维数组
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)Java算法:二分查找
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)VC++中ondraw在什么时候调用的
  • (转载)OpenStack Hacker养成指南
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET 分布式技术比较
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .Net(C#)常用转换byte转uint32、byte转float等