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

【Linux】线程安全-死锁

文章目录

  • 死锁问题
  • 场景1
  • 场景2
  • 死锁的gdb调试
  • 造成死锁的必要条件
    • 不可剥夺
    • 循环等待
    • 互斥条件
    • 请求和保持
  • 预防死锁
    • 破坏必要条件,循环等待&请求和保持
    • 加锁顺序一致
    • 避免锁没有被释放
    • 资源一次性分配

死锁问题

死锁的两种场景:

场景1

线程加锁之后一直没有将锁释放,在上一篇文中,我们模拟过这种场景,某个线程拿到锁,进行加锁,线程退出之前没有释放锁,导致后面的线程不能拿到锁,一直在等待加锁,导致程序一直不退出,这也是为什么条件变量等待函数中第二个参数是锁的原因,在该函数内部,进行解锁,防止死锁

场景2

两个线程都想拥有对方的锁,导致死锁
在这里插入图片描述

两个线程A和B都阻塞在自己的加锁逻辑当中去

代码如下:

执行结果:程序阻塞了,我们来分析一下

在这里插入图片描述

在这里插入图片描述

死锁的gdb调试

先使用gdb attach [pid]命令进入gdb调试状态

再使用 thread apply all bt来查看所有线程的调用堆栈

在这里插入图片描述

t+线程序号=跳转到某个线程的调用堆栈当中

在这里插入图片描述

我们如果想要进入某个具体的堆栈该怎么办呢?

f+[堆栈号]

在这里插入图片描述

可以通过 p + [变量名]来打印这个变量,其中__owner表示锁被谁拿走了

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

对应我们的线程,可以看到,两个锁分别被两个线程持有,同时两个线程全部在等待拿锁,谁都想拿到对方的锁,但是谁也不可能解锁,所以谁都不可能拿到对方的锁,最后就造成死锁。

造成死锁的必要条件

不可剥夺

线程获取到互斥锁后,除非自己释放锁,不然其他线程是不可能进行锁的释放的

循环等待

上述场景2,线程A拿着1锁,请求2锁;线程B拿着2锁,请求1锁。

互斥条件

一个互斥锁,在同一时间只能被一个线程所拥有

请求和保持

吃着碗里的,看着锅里的,已经拿到一个锁,还想请求另一个锁,类似循环等待场景

预防死锁

破坏必要条件,循环等待&请求和保持

我们在加锁的时候可以用pthread_mutex_trylock()和pthread_mutex_timedlock( )函数,这样就能避免一直死等锁,尝试加锁多少次或者超时就放弃加速,让其他线程可以拿到锁

加锁顺序一致

在这里插入图片描述

都先加一锁,再加二锁,这样防止一人拿一把锁,还继续等着拿第二把锁

避免锁没有被释放

在所有线程可能退出的地方都进行解锁

资源一次性分配

多个资源在代码当中有可能每一个资源都需要使用不同的锁进行保护
例如::使用全局变量A,需要1锁,用全局变量B,需要2锁
在这里插入图片描述

就有可能多个线程在使用这两个资源的时候,出现循环等待的情况,解决方法:我们只需要给将A和B用同一把锁保护即可(资源一次性分配)

http://www.lryc.cn/news/151018.html

相关文章:

  • pdf转换成图片免费软件用哪个?pdf转换成图片就用它
  • 【LeetCode】《LeetCode 101》第十二章:字符串
  • Android去掉视频声音
  • java-thread-affinity线程绑核
  • Springboot - 5.test集成
  • 弯道超车必做好题集锦三(C语言编程题)
  • JavaScript基础语法03——JS注释、结束符
  • 常见路由跳转的几种方式
  • 25.选择排序,归并排序,基数排序
  • DataX DorisWriter 插件DorisStreamLoadObserver类详细解读
  • leetcode:1710. 卡车上的最大单元数(python3解法)
  • Spring_JDBC的使用
  • 【Python从入门到进阶】34、selenium基本概念及安装流程
  • 如何确保ChatGPT在文本生成中遵循道德和伦理准则?
  • RISC-V Linux系统rootfs制作
  • git常用场景记录 | 拉取远程分支A合并到本地分支B
  • 如何利用Linux进行数据管理和分析?
  • vue3封装echarts图表数据无法渲染到页面
  • MySQL索引,事务和存储引擎
  • 开发指导—利用CSS动画实现HarmonyOS动效(一)
  • 电商项目part10 高并发缓存实战
  • MongoDB实验——MongoDB shell操作
  • 数据分析师职业发展道路,工作内容是什么?
  • Vue3 + ts的使用
  • CF Edu152 C
  • iBooker 技术评论 20230902
  • 视频动态壁纸 Dynamic Wallpaper for Mac中文
  • Java“牵手”京东商品列表数据,关键词搜索京东商品数据接口,京东API申请指南
  • springboot实战(三)之多环境部署配置文件生效方式
  • java透传参数至logback,自定义日志文件名。过期日志文件自动删除