【线程安全】关于死锁问题

news2024/9/22 21:37:31

文章目录

  • 死锁的基本概念
  • 死锁的四个必要条件
  • 避免死锁
  • 避免死锁的算法
    • 死锁检测算法

死锁的基本概念

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然,线程之间同样也有死锁问题。

死锁的四个必要条件

  • 互斥条件:资源不能被多个线程同时使用,同一时刻最多只有一个线程占有
  • 占有并等待条件:一个进程已经获得了某些资源,同时还在等待被其他线程获取的资源。也称为请求与保持条件,即一个线程因为申请资源而阻塞,但是对自己的获得的资源不释放。
  • 不可剥夺条件:一个已经获得资源的线程不能被强行地剥夺,只能由占有该线程自行释放。
  • 循环等待条件:描述了一种资源分配的闭环,进程之间形成了一个循环等待链。比如A等待B,B等待C,C又等待A。

为什么这四个条件同时满足就一定会造成死锁问题呢?
思考这样一个场景:

假设苹果和梨都是互斥资源
A有一个苹果,B有一个梨,但是A想要的是梨,B想要苹果。于是A在请求B把梨给他,但是A要收到梨才肯交出自己的苹果,对于B也是这样,如果没有外部干预,AB就进入了一直等待的情况即一直等着对方先释放资源。如果允许有外部干预,比如把其中某个人的资源强行释放给对方,比如强行把A的苹果拿给B,B收到苹果就把梨释放了,A也就拿到了梨。这样就AB就脱离了死锁状态。但是如果外部干预也没用,那就彻底没办法了,也就是死锁了

通过上面的例子,首先苹果和梨同一时间只能时是A或者B拥有,这就满足了互斥条件。A等梨,但是又不释放苹果,这就是占有并等待条件。AB相互等待,这就满足了循环等待条件。如果AB还无论如何都不可能被外部强行释放资源,这也就满足了不可剥夺条件

那如果上面的四个条件有一个不满足,我们来看看会不会死锁呢?

  • 破坏互斥条件,即A拿了苹果,B再拿回来就是了。
  • 破坏占有并等待条件,也就是说A拿到苹果之后就马上把苹果释放掉,B拿到梨之后也马上释放掉
  • 破坏不可剥夺条件,也就是说A可以被其它人强行把苹果释放掉,无论A愿不愿意,比如B想要苹果,那就强行从A那里把苹果抢过来
  • 破坏循环等待条件:A释放苹果,不以B先给他梨为先决条件

上面任意一种情况都不会导致死锁。
那么脱离样例,从线程角度来说,该如何避免死锁呢?

避免死锁

  • 破坏死锁的四个条件
  • 加锁顺序一致,本质是破坏循环等待的条件。
  • 避免锁未释放的场景
  • 资源一次性分配,也就是没有线程交叉访问临界资源的情况,每个线程只访问属于自己的资源

避免死锁的算法

死锁检测算法

死锁检测算法用于在系统允许死锁发生的情况下,定期或在特定情况下检测系统是否处于死锁状态,并采取措施恢复。那如何检测呢?
首先要使用到资源分配图

  • 使用图形模型表示资源和进程的分配与请求关系
  • 节点分为两类:一种是线程或者是进程节点,另一种是资源节点
  • 边分为两类:一种表示申请资源,另一种表示持有资源

例如:
在这里插入图片描述
检测思路:检查资源分配图是否出现环,很明显上面图中存在环。

其实还有银行家算法,这里就不做介绍了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1927229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome浏览器的Profile数据内容简介

前文简介了Chrome存储的账密/Cookie数据:一段代码读取Chrome存储的所有账号密码和Cookie 本文再扩展介绍一下Chrome存储的其它一些隐私数据。 注:因为业务需要,简单调研了一些基本内容和存储路径,没有深入去研究,有啥…

C 语言指针进阶

1.0 指针的定义 指针是内存中一个最小单元的编号(内存单元的编号称之为地址【地址就是指针指针就是地址】)指针通常是用来存放内存地址的一个变量。本质上指针就是地址:口语上说的指针起始是指针变量,指针变量就是一个变量&#…

本地部署,Flash Diffusion: 加速条件扩散模型实现快速图像生成

目录 引言 技术背景 Flash Diffusion 的架构与原理 Flash Diffusion 的主要特点 本地部署 运行结果 实验结果与分析 应用实例 结论 GitHub - gojasper/flash-diffusion: Official implementation of ⚡ Flash Diffusion ⚡: Accelerating Any Conditional Diffusion M…

uniapp:国家、省市区,4级联动

使用uview的Select 列选择器 选择器完成国家,省市区,4级联动 要求后台数据格式: list: [{label: 中国,value: 1,children: [{label: 河南省,value: 2,children: [{label: 郑州市,value: 3,children: [{label: 中原区,value: 4},{label: 郑东…

系统架构师考点--系统安全

大家好。今天我来总结一下系统安全相关的考点,这类考点每年都会考到,一般是在上午场客观题,占2-4分。 一、信息安全基础知识 信息安全包括5个基本要素:机密性、完整性、可用性、可控性与可审查性 (1)机密性:确保信息…

嵌入式智能手表项目实现分享

简介 这是一个基于STM32F411CUE6和FreeRTOS和LVGL的低成本的超多功能的STM32智能手表~ 推荐 如果觉得这个手表的硬件难做,又想学习相关的东西,可以试下这个新出的开发板,功能和例程demo更多!FriPi炸鸡派STM32F411开发板: 【STM32开发板】 FryPi炸鸡派 - 嘉立创EDA开源硬件平…

IMS架构中的注册与会话流程:RTPEngine集成及消息路由详解

目录 S-CSCF 调用 RTPengine 整体路由 注意 IMS 注册流程 和 IMS 会话流程 的区别 IMS注册流程 IMS会话流程(如INVITE请求) 这种设计的原因 P-CSCF 调用 RTPengine S-CSCF 调用 RTPengine 整体路由 UA a生成SDP offer,发送SIP INVITE请求(包含SDP offer)&…

MySql 数据库 - 下载安装

MySQL数据库 简单介绍 数据库 数据存储的仓库数据库管理系统 操作和管理数据库的大型软件SQL 操作关系型数据库的变成语言,是一套标准 版本 MySQL官方提供了两种不同的版本: 社区版 免费,MySQL不提供任何的技术支持商业版 收费&#xff0c…

数据结构(单链表(1))

前言 线性表中有着许多的结构,如顺序表和链表。而单链表则是链表的最基础的一种形式,下面就让我们对其做一个了解。 概念 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次…

【python】Pandas中`ValueError: cannot reindex from a duplicate axis`错误分析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

构建GitLab代码私有仓库

构建代码私有仓库 公司代码仓库一般都放在git上,但为了安全一般都不会放在开放的git上,都会搭建自己的仓库,今天就记录一下git搭建的过程。以下安装过程以centos7为例: 步骤一:安装并配置依赖项,同时打开ht…

解决gitlab报502的问题

external_url http://10.7.24.6:10002 puma[port] 8091 sudo gitlab-ctl reconfigure sudo gitlab-ctl restart 设置管理员密码: 1. 切换目录:cd 安装目录gitlab的bin目录下 2. 以root执行 :gitlab-rails console命令,等待…

HTTP背后的故事:理解现代网络如何工作的关键(一)

一.HTTP是什么 概念 : 1.HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议。 2.HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 3.HTTP 往往是基于传输层的 TCP 协议实现的 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 T…

Linux离线安装Mysql5.7

Linux之Mysql安装配置 第一种:Linux离线安装Mysql(提前手动下载好tar.gz包) 第二种:通过yum安装配置Mysql(服务器有网络) 之前在阿里云上采用yum安装过一次(请看这里),…

文心一言 VS 讯飞星火 VS chatgpt (303)-- 算法导论22.2 1题

一、请计算出在有向图22-2(a)上运行广度优先搜索算法后的d值和π值。这里假定结点3为算法所用的源结点。如果要写代码,请用go语言。 文心一言: 在Go语言中实现广度优先搜索(BFS)以计算有向图上的距离(d值&#xff09…

【Java--数据结构】队列与栈的相互成就

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 用队列实现栈 用栈实现队列 用队列实现栈 oj链接 一个队列是无法实现栈的 入栈push:把数据放到不为空的队列当中。 注意:第一次入栈时&…

【K8s】专题七(2):Kubernetes 服务发现之 Ingress

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号! 目录 一、基本介绍 二、工作原理 三、资源清单(示例) 1、Ingress Cont…

为什么要使用加密软件?

一、保护数据安全:加密软件通过复杂的加密算法对敏感数据进行加密处理,使得未经授权的人员即使获取了加密数据,也无法轻易解密和获取其中的内容。这极大地提高了数据在存储、传输和使用过程中的安全性。 二、遵守法律法规:在许多国…

MMLab-dataset_analysis

数据分析工具 这里写目录标题 数据分析工具dataset_analysis.py数据可视化分析 benchmark.pybrowse_coco_json.pybrowse_dataset.pyOptimize_anchors mmyolo、mmsegmentation等提供了数据集分析工具 dataset_analysis.py 数据采用coco格式数据 根据配置文件分析全部数据类型或…

方便好用的C#.Net万能工具库Masuit.Tools

文章目录 简介开发环境安装使用特色功能示例代码1. 检验字符串是否是Email、手机号、URL、IP地址、身份证号等2.硬件监测(需要管理员权限,仅支持Windows,部分函数仅支持物理机模式)3.html的防XSS处理:4.整理Windows系统的内存:5.任…