线程互斥量死锁,与sleep没有关联

2023-05-16

文章目录

  • 死锁问题
    • 死锁原因
    • 产生死锁的几个常见场景
    • 死锁产生的四个必要条件==仅供参考
      • 互斥条件
      • 占有和等待条件
      • 不可抢占条件
      • 环路等待条件

pthread_mutex_lock(),线程互斥量死锁,与sleep没有关联.
项目上,定位死锁原因,无意中看到pthread_mutex_lock()以及 sleep()字样的文章.说的模糊不清,但是又貌似有些因果.
反复查阅资料以及测试,完全可以确认:
pthread_mutex_lock(),线程互斥量死锁,与sleep没有关联.

死锁问题

死锁原因

如果一个线程试图对同一个互斥量加锁两次(并且没有其他线程释放锁),自身就会陷入死锁状态。当该线程第一次去向互斥量加锁时,由于该互斥量上并没有锁,所以可以加锁成功,但是该线程第二次去向互斥量加锁,由于该互斥量上已经加过锁了,所以会把自身挂起阻塞,直到该锁被释放,但是自己又被挂起了,所以不会有人去释放的,这就造成了死锁问题。

一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待占用锁的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁,因此 就永远处于挂起等待状态了,于是就形成了死锁(Deadlock)。

当一个线程去申请一个已经被持有,但是还没有释放的互斥量时,线程将会被阻塞,直到该互斥量被释放。如果该互斥量不被释放,该线程将会被一直阻塞。死锁就是,一个线程阻塞的等待一个永远不会为真的条件。

产生死锁的几个常见场景

假设程序中现在有一个互斥量,然后一个线程对该互斥量已经加锁,但是在加锁和解锁的这段代码中,如果该区域代码又试图向该互斥量申请锁,那么就会造成自身挂起等待,从而导致死锁。

假设程序中使用两个互斥量,线程A首先锁住一个互斥量,然后线程B也锁住另外一个互斥量,拥有第一个互斥量的线程A又去试图锁住第二个互斥量,而拥有第二个互斥量的线程B试图申请锁住第一个互斥量,这就会导致两个线程此时都在挂起堵塞中,两个线程都在相互请求另一个线程的资源导致两个线程都无法向前运行,于是产生了死锁问题。

死锁产生的四个必要条件==仅供参考

上边的两种产生死锁的场景是在互斥量的条件下,但是这造成死锁的场景,并不局限于互斥量,只要满足产生死锁的条件,就会出现死锁。针对死锁的概念,大牛们总结出来了四条产生死锁的必要条件:

四个条件必须同时满足,才会可能造成死锁。只要有一个条件不满足,就不会造成死锁。死锁的产生并不仅会只有使用互斥量时会发生,只要满足四个条件也可能产生死锁。在系统中,有许多只能被互斥性访问的独占资源,如请求独占性的io设备,打印机等,在对其进行操作时,也有可能造成死锁。

互斥条件

互斥条件与锁一样,要么能被申请,要么就只能等待。在任意时刻,某份资源只能被一个进程或线程使用。

占有和等待条件

占有和等待条件是指某个线程或进程,在占有某份资源后还可以申请其他的资源。

不可抢占条件

当某份资源被某一进程或线程占有时,不能被其他线程或进程强制性的抢占,只能被占有它的线程主动的释放。

环路等待条件

死锁发生时,系统中一定有两个或两个以上的进程组成的一条环路,该环路中的每一个线程或进程都在等待下一个进程所占用的资源。

参考:
<UNIX环境高级编程>,11.6,线程同步章节.
Linux多线程学习(2)–线程的同步与互斥及死锁问题(互斥量和条件变量)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程互斥量死锁,与sleep没有关联 的相关文章

  • Ubuntu 16.04中用bazel交叉编译tensorflow lite

    首先在csdn上着了大神关于这个的实践如下链接 https www cnblogs com jojodru p 7744630 html 但是报错如下 xff0c 说是找不到opt选项 INFO Reading rc options for
  • 【原创】岁月如歌 一款网易歌单生成pdf的软件

    介绍 这是一款可以将网易云音乐的歌单中所有歌词输出为pdf的软件 项目持续维护地址 http brightguo com song list to pdf 目前没有搜到相关网易歌单导出为pdf的软件 xff0c 因此我特地将此软件开发出来免
  • 国内人脸识别公司哪家强,人脸比对跑个分比较下!

    前不久 最强大脑 第四季第一期的舞台上 xff0c 王峰对阵小度机器人进行了 人机大战 xff0c 其中最精彩和有趣的是第一场pk 从小时候照片判别长大后对应的人 xff0c 而她有个姐姐 xff0c 这对姐妹恰恰是双胞胎 xff01 百度
  • 2011年终总结

    2011年终总结 4月8日 xff0c 研究生面试 xff0c 和同学第一次来到上海 xff0c 当时的我又经受一次失败 xff0c 也许说我本该走这条路 也经常听到很多人说 xff0c 自己考得烂了 xff0c 最后到这个学校上学 从高中
  • 永久音乐外链

    使用skydrive上传速度变慢了 xff01 2013 2 14 文摘 xff1a http tieba baidu com p 1735575571 被删掉了 xff0c 2013 2 14 一直在申请吧主 xff0c 估计申请不上了
  • Apache2.2+MySql5.5+PHP5.4的安装和配置(windows)

    Apache2 2 43 MySql5 5 43 PHP5 4的安装和配置 phpMyAdmin的安装和配置 安装 Apache2 2 http httpd apache org download cgi apache24 Win32 Bi
  • 反思了一下过去几年的程序员之路

    最近回忆起一年前的找工作时的面试时的题目 xff0c 很多基础题都没做好 xff0c 很多概念也混淆不清 虽然自己这几年写的代码不少 xff0c 但都使用自己熟悉的东西写 xff0c 而已经有很多新的技术新的方法却没有使用过 一方面公司自己
  • 怎样使用OpenCV进行人脸识别 [停止更新]

    唯一持续维护地址 xff1a http guoming me face recognition with opencv 更新 2013 6 27 停止人脸识别的研究 xff0c 具体人脸识别系统可以参见文章 使用Kinect进行人脸识别 K
  • OpenCV矩阵运算

    一 矩阵 Mat I img I1 I2 dst A B double k alpha Scalar s 1 加法 I 61 I1 43 I2 等同add I1 I2 I add I1 I2 dst mask dtype scaleAdd
  • OpenCV官方学习文档[2013-7-4更新][最新版本2.4.6]

    最新的OpenCV2 4 6文档更新参见 xff1a http guoming me opencv OpenCV配置视频 OpenCV2 4 6 2013 7 3更新 http opencv org opencv 2 4 6 is out
  • ANSI与UNICODE字符函数对照表

    宽字符处理函数函数与普通函数对照表 字符分类 xff1a 宽字符函数普通 C 函数描述 iswalnum xff08 xff09 isalnum xff08 xff09 测试字符是否为数字或字母 iswalpha xff08 xff09 i
  • 做 LeetCode 有感

    今天周六 xff0c 公司一个人也没有 xff0c 下午花了5个半小时 xff0c 安安静静的再看 xff0c 再做了4道 LeetCode 的题目 看完之后 xff0c 现在仔细回想 xff0c 获得了什么 xff0c 好像什么也没有 但
  • 知识点滴 - 关于头文件的重复包含问题

    使用Include guard的目的 C Language Tutorial 61 gt Header Include Guards 2 12 Header guards Learn C 43 43 C C 43 43 中 xff0c in
  • 编程参考 - 编程中给变量起名时如何选择前缀,以及匈牙利命名法等

    我最开始当程序员用C语言写代码 xff0c 公司里推行编码规范 xff0c 变量的前缀都是有规定的 比如整型变量 xff0c 前面都是 u8Name i8Name u16Name i16Name之类的 尤其是嵌入式编程 xff0c 涉及到代
  • 【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红

    一 八皇后问题 八皇后问题 xff0c 一个古老而著名的问题 xff0c 是回溯算法的经典案例 该问题由国际西洋棋棋手马克斯 贝瑟尔于1848年提出 xff1a 在8 8格的国际象棋上摆放八个皇后 xff0c 使其不能互相攻击 xff0c
  • Linux常用命令

    nbsp nbsp 作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经70
  • 读《Java编程思想第五版》心得体会

    x1f345 Java学习路线 xff1a 搬砖工逆袭Java架构师 x1f345 简介 xff1a Java领域优质创作者 x1f3c6 CSDN哪吒公众号作者 Java架构师奋斗者 x1f4aa x1f345 扫描主页左侧二维码 xff
  • 那些优秀的程序员都在看哪些书?

    目录 一 Java 27岁生日啦1995年5月23日2004年2015年2019年2022年 二 Java核心技术 卷1 基础知识 原书第11版 xff09 Core Java 三 Java核心技术 卷2 高级特性 原书第11版 xff09
  • c++ 判断文件是否存在的几种方法

    一般方法 一般而言 xff0c 下述方法都可以检查文件是否存在 xff1a 使用ifstream打开文件流 xff0c 成功则存在 xff0c 失败则不存在以fopen读方式打开文件 xff0c 成功则存在 xff0c 否则不存在使用acc
  • Linux下c/c++头文件和库文件的查找路径

    简介 这是个相当基础的话题 xff0c 平时也觉得知道一点 如头文件会先在当前目录查找 xff0c 如果未找到会查找系统目录 但当问题出现时 xff0c 还是有点不知所措 xff0c 对所谓的 系统目录 一知半解 xff0c 很难把它们的清

随机推荐

  • Tars框架在windows10下安装

    依赖环境 windows版本 xff1a win7以上cmake xff1a 3 2以上mysql 4 1 17以上nvm xff1a 0 35 1以上node 12 13 0以上 分别安装vs2019 xff0c nodejs git m
  • ROS基础(一):ROS通讯之话题(topic)通讯

    目录 第一章 xff1a ROS通讯之话题 topic 通讯一 topic通讯之基础篇1 Node Master大管家2 Node节点3 message 与topic4 小结5 实例 二 topic通讯之进阶篇1 创建learn topic
  • 解决已安装numpy仍然报错ModuleNotFoundError: No module named ‘numpy‘

    简介 目前 xff0c 大多数Linux系统自带python2了 但是很多应用却需要python3 于是安装了python3 每次执行的时候 xff0c 输入python时默认启动python2 xff0c 输入python3才会启动pyt
  • opencv ImportError: libGL.so.1: cannot open shared object file: No such file or directory

    ModuleNotFoundError No module named cv2 使用opencv测试时 xff0c 发现没有安装 xff0c 报错如下 xff1a 安装一下吧 xff1a pip install opencv python
  • CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本 xff1a cmake未提供的功能而实际构建中又需要时 xff0c 如获取Linux发行版本项目构建时需要执行脚本才能完成 xff0c 如boost构建过程 有的需要shell脚本的返
  • rsync增量同步文件用法实践

    rsync rsync remote sync xff0c 远程同步 xff0c 用于在本地机器及远程机器之间同步数据 对于本地机器之内 xff0c 同步数据使用cp即可 对于本地与远程 xff0c 使用scp即可 但上面两个命令同步数据时
  • 关于职业生涯发展的一点思考

    职业类型 从学校毕业步入社会 xff0c 即正式开始了人生职业生涯发展的第一步 总括地说 xff0c 大概有以下几类职业 xff1a 当公务员 xff0c 从政创立公司 xff0c 当企业家找一份工作 xff0c 成为职员 这三条道路 xf
  • c++矩阵计算性能对比:Eigen和GPU

    生成随机矩阵 生成随机矩阵有多种方式 xff0c 直接了当的方式是使用显式循环的方式为矩阵的每个元素赋随机值 span class token macro property span class token directive hash s
  • c语言中 char* 和 unsigned char* 的区别浅析

    背景 最近在项目中遇到了一个编译警告 xff0c 是因为定义的变量为char xff0c 而在使用时作为函数的unsigned char 类型的参数调用 这个警告很容易避免 xff0c 但是char 和unsigned char 到底有什么
  • c语言中static关键字用法详解

    概述 static关键字在c语言中比较常用 xff0c 使用恰当能够大大提高程序的模块化特性 xff0c 有利于扩展和维护 但是对于c语言初学者 xff0c static由于使用灵活 xff0c 并不容易掌握 本文就static在c语言中的
  • linux下把进程/线程绑定到特定cpu核上运行

    概述 现在大家使用的基本上都是多核cpu xff0c 一般是4核的 平时应用程序在运行时都是由操作系统管理的 操作系统对应用进程进行调度 xff0c 使其在不同的核上轮番运行 对于普通的应用 xff0c 操作系统的默认调度机制是没有问题的
  • git中submodule子模块的添加、使用和删除

    背景 项目中经常使用别人维护的模块 xff0c 在git中使用子模块的功能能够大大提高开发效率 使用子模块后 xff0c 不必负责子模块的维护 xff0c 只需要在必要的时候同步更新子模块即可 本文主要讲解子模块相关的基础命令 xff0c
  • ros下package中CMakelists的编写

    目录 一 package自动生成的Cmakelists1 指定cmake版本2 项目名字3 寻找构建所需依赖包4 启用python模块依赖5 Message Service Action 生成文件6 启动 message services
  • STM32跳至硬件错误中断(HardFault_Handle) 原因及参考解决方法

    一 HardFault Handle引起的原因 1 遇到错误问题是数据类型不对 xff0c 导致该步骤永远不能执行到 xff0c 跳至硬件错误中断 xff1b 所以硬件中断可尝试查找数据类型错误 2 堆栈设置错误也会跳至hardwarefa
  • 时间与日期插件 -- laydate 使用方法(摘自官网)

    简单例子 xff1a function var start 61 elem 39 start 39 选择ID为START的input format 39 YYYY MM DD hh mm ss 39 自动生成的时间格式 min laydat
  • nginx部署vue项目(包括一个nginx部署多个vue项目)

    部署准备 vue项目打包 首先打开public下的index目录 xff0c 修改后台的URL地址 xff0c 如下图所示 xff1a 使用CMD xff0c 打开命令行程序 进入项目根目录 执行命令 xff1a npm run build
  • 雅可比(Jacobian)矩阵

    在向量分析中 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵 其行列式称为雅可比行列式 还有 在代数几何中 代数曲线的雅可比量表示雅可比簇 xff1a 伴随该曲线的一个代数群 曲线可以嵌入其中 它们全部都以数学家卡尔 雅可比 Carl Jac
  • 粒子滤波方法入门

    例子滤波方法入门 xff1a 分析典型非线性系统数学模型 主要内容 xff1a 1 非线性数学模型 2 用粒子滤波的MATLAB程序简介 1 非线性数学模型 2 用粒子滤波的MATLAB程序简介 function output args 6
  • 关于VIO中IMU预积分的讲解

    Why VIO 转自 xff1a https zhehangt github io 2019 03 23 SLAM Basic VIOInit 首先我们先简单回顾一下为什么要做VIO xff0c 以及为什么要做VIO初始化 我们知道单目相机
  • 线程互斥量死锁,与sleep没有关联

    文章目录 死锁问题死锁原因产生死锁的几个常见场景死锁产生的四个必要条件 61 61 仅供参考互斥条件占有和等待条件不可抢占条件环路等待条件 pthread mutex lock 线程互斥量死锁 与sleep没有关联 项目上 定位死锁原因 无