当前位置: 首页 > 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用同一把锁保护即可(资源一次性分配)

相关文章:

【Linux】线程安全-死锁

文章目录 死锁问题场景1场景2死锁的gdb调试造成死锁的必要条件不可剥夺循环等待互斥条件请求和保持 预防死锁破坏必要条件,循环等待&请求和保持加锁顺序一致避免锁没有被释放资源一次性分配 死锁问题 死锁的两种场景: 场景1 线程加锁之后一直没有将锁…...

pdf转换成图片免费软件用哪个?pdf转换成图片就用它

随着技术的发展,现在企业办公运用到的电子文档各种各样,我们日常需要掌握的技能越来越高要求,其中pdf和图片是我们经常接触的文件格式之一,而且这两个文件格式我们会经常将它们进行转换,那么pdf转换成图片怎么操作呢?…...

【LeetCode】《LeetCode 101》第十二章:字符串

文章目录 12.1 字符串比较242 . 有效的字母异位词(简单)205. 同构字符串(简单)647. 回文子串(中等)696 . 计数二进制子串(简单) 12.2 字符串理解224. 基本计算器(困难&am…...

Android去掉视频声音

【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据_android 去掉视频音频_little_fat_sheep的博客-CSDN博客 void removeSound() {try {String path Environment.getExternalStorageDirectory().getPath();String filename "no_sound_" input_p…...

java-thread-affinity线程绑核

通过将线程绑定到指定的cpu上&#xff0c;可以提高执行效率。因为每次都是相同的cpu,可以充分利用高速缓存&#xff0c;在java中可以使用以下依赖来使用。 <dependency><groupId>net.openhft</groupId><artifactId>affinity</artifactId><ver…...

Springboot - 5.test集成

&#x1f440;1. 简介 spring-boot-starter-test是Spring Boot框架中的一个模块&#xff0c;用于支持在项目中进行单元测试和集成测试。它提供了一些依赖项和工具&#xff0c;使得编写和运行测试变得更加方便。以下是关于spring-boot-starter-test的全面介绍&#xff1a; ✌1…...

弯道超车必做好题集锦三(C语言编程题)

目录 前言&#xff1a; 1.单词倒排 方法1&#xff1a;scanf匹配特定字符法 方法2&#xff1a; 双指针法 2.统计每个月兔子的总数 方法1&#xff1a;斐波那契数列 方法2&#xff1a;斐波那契的递归 3.珠玑妙算 方法&#xff1a;遍历 4.寻找奇数&#xff08;单身狗&#…...

JavaScript基础语法03——JS注释、结束符

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天继续学习JavaScript基础语法知识&#xff0c;注释和结束符&#xff0c;以下为学习笔记。 一、JavaScript注释 JavaScript注释有什么作用&#xff1f; JavaScript注释可以提高代码的可读性&#xff0c;能够帮助像…...

常见路由跳转的几种方式

常见的路由跳转有以下四种&#xff1a; 1. <router-link to"跳转路径"> /* 不带参数 */ <router-link :to"{name:home}"> <router-link :to"{path:/home}"> // 更建议用name // router-link链接中&#xff0c;带/ 表示从根…...

25.选择排序,归并排序,基数排序

目录 一. 选择排序 &#xff08;1&#xff09;简单选择排序 &#xff08;2&#xff09;堆排序 二. 归并排序 三. 基数排序 四. 各种排序方法的比较 &#xff08;1&#xff09;时间性能 &#xff08;2&#xff09;空间性能 &#xff08;3&#xff09;排序方法的稳定性能…...

DataX DorisWriter 插件DorisStreamLoadObserver类详细解读

DorisStreamLoadObserver 类是一个用于将数据加载到 Doris&#xff08;以前称为 Palo&#xff09;数据库中并监视加载过程的 Java 类。该类提供了一组方法&#xff0c;用于构建 HTTP 请求、处理 HTTP 响应以及监控数据加载的状态。以下是每个方法的具体作用&#xff1a; Doris…...

leetcode:1710. 卡车上的最大单元数(python3解法)

难度&#xff1a;简单 请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes &#xff0c;其中 boxTypes[i] [numberOfBoxesi, numberOfUnitsPerBoxi] &#xff1a; numberOfBoxesi 是类型 i 的箱子的数量。numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。…...

Spring_JDBC的使用

Spring 是个一站式框架&#xff1a;Spring 自身也提供了控制层的 SpringMVC和持久层的 Spring JdbcTemplate。 配置信息 1.下载 Spring JdbcTemplate 的 jar 包,在pom.xml中导入 <dependency><groupId>org.springframework</groupId><artifactId>spr…...

【Python从入门到进阶】34、selenium基本概念及安装流程

接上篇《33、使用bs4获取星巴克产品信息》 上一篇我们介绍了如何使用bs4来解析星巴克网站&#xff0c;获取其产品信息。本篇我们来了解selenium技术的基础。 一、什么是selenium&#xff1f; Selenium是一种用于自动化Web浏览器操作的开源工具。它提供了一组API&#xff08;应…...

如何确保ChatGPT在文本生成中遵循道德和伦理准则?

确保ChatGPT在文本生成中遵循道德和伦理准则是一个复杂而重要的任务。人工智能&#xff08;AI&#xff09;系统&#xff0c;特别是语言模型&#xff0c;具有强大的生成能力&#xff0c;但如果不受到道德和伦理准则的约束&#xff0c;可能会导致一系列问题&#xff0c;包括歧视、…...

RISC-V Linux系统rootfs制作

文章目录 1、下载2、配置与编译3、运行 buildroot 是一个构建嵌入式Linux系统的框架。整个 buildroot 是由Makefile(*.mk) 脚本和 Kconfig(Config.in) 配置文件构成的&#xff0c;因此可以像配置 Linux 内核一样执行 make menuconfig 进行配置&#xff0c;编译出一个完整的、可…...

git常用场景记录 | 拉取远程分支A合并到本地分支B

文章目录 git常用场景记录拉取远程分支A合并到本地分支B本地分支B存在未add与commit的代码 git常用场景记录 doing&#xff0c;最后更新9.1 拉取远程分支A合并到本地分支B 需求描述 在团队合作时&#xff0c;我自己的本地分支B功能已经实现并合并到feature&#xff0c;之后发现…...

如何利用Linux进行数据管理和分析?

Linux是一款非常强大的操作系统&#xff0c;它不仅可以帮助你管理数据&#xff0c;还可以让你成为一名数据分析大师。只要你会使用命令行&#xff0c;你就可以用Linux进行数据管理和分析。 现在&#xff0c;让我们来看看如何使用Linux进行数据管理。 使用sort命令对数据进行排…...

vue3封装echarts图表数据无法渲染到页面

问题是后端的数据已经成功返回到前端了&#xff0c;但是Echarts图表一直不能被渲染&#xff0c;卡了一个多小时&#xff0c;最后问gpt才解决&#xff08;gptyyds&#xff01;&#xff01;&#xff01;&#xff09; methods: {loadGet() {this.$axios.get(this.$httpUrl /goods…...

MySQL索引,事务和存储引擎

一、索引 1、索引的概念 ●索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;。 ●使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先…...

从COCO到自定义:用Labelme为YOLOv8-Pose制作关键点数据集的完整避坑指南

从COCO到自定义&#xff1a;用Labelme为YOLOv8-Pose制作关键点数据集的完整避坑指南 在计算机视觉领域&#xff0c;关键点检测技术正逐渐成为工业界和学术界的热点研究方向。不同于传统的目标检测任务&#xff0c;关键点检测不仅需要定位物体位置&#xff0c;还要精确识别物体内…...

Jetson Nano避坑指南:从CUDA到YOLOv5,我踩过的那些坑和最终解决方案

Jetson Nano深度排雷手册&#xff1a;CUDA到YOLOv5实战问题全解析 当这块信用卡大小的开发板第一次出现在我的工作台上时&#xff0c;我完全没预料到接下来两周会经历怎样的"技术炼狱"。从CUDA环境变量配置的幽灵报错&#xff0c;到PyTorch的非法指令崩溃&#xff0c…...

Tina Linux syslog实战指南:从架构解析到嵌入式日志管理优化

1. 项目概述&#xff1a;为什么你需要关注Tina Linux的syslog在嵌入式Linux开发&#xff0c;尤其是基于全志Tina Linux这类高度定制化的平台上&#xff0c;日志系统是开发者定位问题、监控系统状态的“眼睛”。很多刚接触Tina Linux的朋友&#xff0c;可能会觉得系统日志&#…...

Node.js框架深度解析:从Express到Nest.js,如何选择最适合你的Web开发框架?

1. 项目概述&#xff1a;为什么Node.js框架值得你花时间研究&#xff1f;如果你是一名Web开发者&#xff0c;或者正在向这个方向转型&#xff0c;那么“Node.js框架”这个词组对你来说一定不陌生。但面对市面上林林总总的框架&#xff0c;从Express、Koa到Nest.js、Fastify&…...

别再乱建索引了!用进销存系统的真实案例,聊聊MySQL索引优化与视图设计的那些坑

MySQL索引优化与视图设计实战&#xff1a;进销存系统的避坑指南 当你的进销存系统从几百条记录增长到数百万条时&#xff0c;那些曾经瞬间完成的查询开始变得迟缓&#xff0c;收银台前的顾客开始不耐烦地敲击柜台&#xff0c;而老板的脸色也随着系统响应时间的增加而越发阴沉。…...

AUTOSAR Ea模块深度剖析:从原理到实战的EEPROM抽象层配置与优化

1. 项目概述&#xff1a;为什么我们需要深入理解Ea模块&#xff1f;在AUTOSAR的软件架构里&#xff0c;NVRAM管理器&#xff08;NvM&#xff09;负责非易失性数据的抽象管理&#xff0c;而Ea&#xff08;EEPROM Abstraction&#xff0c;EEPROM抽象&#xff09;模块&#xff0c;…...

终极Il2CppDumper使用指南:从原理到实战的Unity逆向工程利器

终极Il2CppDumper使用指南&#xff1a;从原理到实战的Unity逆向工程利器 【免费下载链接】Il2CppDumper Unity il2cpp reverse engineer 项目地址: https://gitcode.com/gh_mirrors/il/Il2CppDumper Il2CppDumper是一款强大的Unity il2cpp逆向工程工具&#xff0c;能够帮…...

【AI概念设计黄金标准】:NASA前可视化总监揭秘——如何用Midjourney输出符合影视工业管线的分镜资产

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI概念设计黄金标准的工业级定义 在高可靠性AI系统开发中&#xff0c;“概念设计”并非抽象构思阶段&#xff0c;而是承载可验证性、可追溯性与可部署性的工程锚点。工业级定义要求该阶段输出必须满足…...

BepInEx框架指南:从游戏玩家到模组开发者的完整升级路径

BepInEx框架指南&#xff1a;从游戏玩家到模组开发者的完整升级路径 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 你是否曾经羡慕过那些能够为游戏添加新内容、修改界面、甚至创…...

DayZ单机模组终极指南:打造专属末日世界的5个关键步骤

DayZ单机模组终极指南&#xff1a;打造专属末日世界的5个关键步骤 【免费下载链接】DayZCommunityOfflineMode A community made offline mod for DayZ Standalone 项目地址: https://gitcode.com/gh_mirrors/da/DayZCommunityOfflineMode 厌倦了DayZ在线服务器中的网络…...