码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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用同一把锁保护即可(资源一次性分配)

  • 相关阅读:
    MCAL知识点(二十七):TC275如何通过GPT12实现ABZ解码
    前馈神经网络(FFNN)和多层感知机(MLP)
    【Linux】Windows安装VirtualBox虚拟机以及CentOS操作系统
    linux ssh 密钥配置
    云流化:XR扩展现实应用发展的一个新方向!
    Cassandra 设计最佳实践
    try catch finally代码块的作用
    MyBatis核心对象
    用helm安装chart的时候如何使用master的IP
    【电脑讲解】文件夹怎么设置密码
  • 原文地址:https://blog.csdn.net/weixin_56916549/article/details/132609266
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号