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

死锁的发生原因和怎么避免

项目场景:

提示:这里简述项目相关背景:

例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)


问题描述

        死锁,简单来说就是两个或者两个以上的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。

        如果没有外部干预,线程会一直阻塞无法往下执行,这些一直处于相互等待资源的线程 就称为死锁线程。如下图所示。


 问题分析

        导致死锁的条件有四个,也就是这四个条件同时满足就会产生死锁。

        1、互斥条件,共享资源 X 和 Y 只能被一个线程占用;

        2、请求和保持条件,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;

        3、不可抢占条件,其他线程不能强行抢占线程 T1 占有的资源;

        4、循环等待条件,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有 的资源,就是循环等待


 问题解决

        导致死锁之后,只能通过人工干预来解决,比如重启服务,或者杀掉某个线程。 所以,只能在写代码的时候,去规避可能出现的死锁问题。

         按照死锁发生的四个条件,只需要破坏其中的任何一个,就可以解决,但是,互斥条件 是没办法破坏的,因为这是互斥锁的基本约束,其他三方条件都有办法来破坏:

        1、 对于“请求和保持”这个条件,我们可以一次性申请所有的资源,这样就不存在等待了。

        2、 对于“不可抢占”这个条件,占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源,这样不可抢占这个条件就破坏掉了。

        3、对于“循环等待”这个条件,可以靠按序申请资源来预防。所谓按序申请,是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的, 这样线性化后自然就不存在循环了。

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

相关文章:

  • visual studio 生成dll文件以及修改输出dll文件名称操作
  • 【Leetcode】73.矩阵置零
  • zabbix监控mysql容器主从同步状态并告警钉钉/企业微信
  • ARM 常见汇编指令学习 9 - 缓存管理指令 DC 与 IC
  • 落地数字化管理,提升企业市场竞争力
  • 2023华数杯数学建模竞赛C题思路解析
  • Photon之如何解决Photon Server无法在局域网使用的bug
  • Redis两种持久化方案RDB持久化和AOF持久化
  • 银河麒麟v10 vnc环境配置
  • 【动态内存管理助力程序优化与性能飞升】
  • 电动汽车设计、制造、研发的学科、技术和前沿科技综述
  • NsPack3.x脱壳手记
  • 在.net 6.0中 调用远程服务器web服务,Webservices(xxx.asmx) ,RESTful 风格,2种解决方案。
  • 深度学习基础01-深度学习简介
  • Flink DataStream API详解
  • 【如何使用cv::erode()函数对图像进行腐蚀操作】
  • C++数据结构之BST(二叉搜索树)的实现
  • QT以管理员身份运行
  • java中的缓冲流
  • 【小吉带你学Git】idea操作(1)_配置环境并进行基本操作
  • DP-GAN-生成器代码
  • 2020-2023中国高等级自动驾驶产业发展趋势研究
  • JDK19 - synchronized关键字导致的虚拟线程PINNED
  • 用msys2安装verilator并用spinal进行仿真
  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】
  • Vue使用QuillEditor富文本编辑器问题记录
  • spring AOP学习
  • 16.M端事件和JS插件
  • Zebec APP:构建全面、广泛的流支付应用体系
  • Spark 3.1.1 遇到的 from_json regexp_replace组合表达式慢问题的解决