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

文章目录

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

死锁的基本概念

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

死锁的四个必要条件

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV中使用Canny算法在图像中查找边缘

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出,旨在寻找给定噪声条件下的最佳边…

部署大语言模型并对话

随着人工智能技术的飞速发展,大语言模型(Large Language Models, LLMs)因其强大的语言理解和生成能力而备受关注。OpenWebUI ,原名 Ollama WebUI ,是一款专为大语言模型(LLM)设计的先进 Web 交互…

Facebook的未来蓝图:从元宇宙到虚拟现实的跨越

随着科技的不断演进和社会的数字化转型,虚拟现实(VR)和增强现实(AR)作为下一代计算平台正逐渐走进人们的视野。作为全球领先的科技公司之一,Facebook正在积极探索并推动这一领域的发展,以实现其…

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘(dashboard)后,可以通过修改看板属性中的SLUG等,生成url 举例: http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式:此处参考了官…

论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能

摘要 思维链提示(Chain-of-thought prompting)在多种自然语言推理任务上展现了卓越的性能。然而,在需要解决的问题比提示中展示的示例更难的任务上,它的表现往往不佳。为了克服从简单到困难的泛化挑战,我们提出了一种新…

请你谈谈:BeanDefinition类作为Spring Bean的建模对象,与BeanFactoryPostProcessor之间的羁绊

那么,我们如何理解Spring Bean的建模对象呢?简而言之,它是指用于描述和配置Bean实例化过程的模型对象。有人可能会提出疑问,既然只需要Class(类)就可以实例化一个对象,Class作为类的元数据&…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下,我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作,更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点,开发了大量配套3D教材,让…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写,用于精确控制 HTML 页面的样式,以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的,好的浏览器有更好的显示,糟糕的浏览器…

C\C++ 终端输出带有颜色的字符

终端显示带有颜色的字符 终端显示带有颜色的字符 终端显示带有颜色的字符背景:测试机器,win10系统, VS2022编写字体设置不同的颜色背景色光标移动 (这个用的估计不是很多)字体设置动态显示C cout 也可以测试代码准确的…

【C++】继承(二)

目录 5、继承与友元 6、继承与静态成员 7、复杂的菱形继承和菱形虚拟继承 8、继承的总结与反思 5、继承与友元 友元关系不能继承,也就是说父类的友元不能访问子类的私有或保护的成员 class Student; class Person { public:friend void Display(const Person&a…

.net C# 使用网易163邮箱搭建smtp服务,实现发送邮件功能

功能描述:使用邮箱验证实现用户注册激活和找回密码。邮箱选择网易163作为smtp服务器。 真实测试情况:第一种:大部分服务器运行商的25端口默认是封禁的,可以联系运营商进行25端口解封,解封之后可以使用25端口。第二种&…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多,需要分割创建环境的情况时有出现,在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

OpenCV解决验证码(数字和字母)识别(Python)

文章目录 前言一、准备验证码图片 前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库。它支持Windows、Linux、Mac OS、Android和iOS等多个操作系统,提供了丰富的图像处理和计算机视觉功能,包括但…

链路追踪系列-01.mac m1 安装zipkin

下载地址:https://hub.docker.com/r/openzipkin/zipkin jelexjelexxudeMacBook-Pro zipkin-server % pwd /Users/jelex/Documents/work/zipkin-server 先启动Es: 可能需要先删除 /Users/jelex/dockerV/es/plugins 目录下的.DS_Store 当端口占用时再次启动&#x…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行,下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机,上位机将信息进行处理展示判断下位机传感器数据,如果超过设置的阈值&a…

【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS

局域网设备访问WampServer 参考&#xff1a;https://www.jianshu.com/p/d431a845e5cb 修改Apache的httpd.conf文件 D:\Academic\Wamp\program\bin\apache\apache2.4.54.2\conf\httpd.conf 搜索 Require local 和Require all denied&#xff0c;改为Require all granted <…

【排序算法】计数排序

目录 一.基本思想 二.缺陷及优化 三.代码实现 四.特性总结 1.可以排序负数 2.适合范围集中的整数 3.时间复杂度&#xff1a;O(Nrange) 4.空间复杂度&#xff1a;O(range) 5.稳定性&#xff1a;稳定 一.基本思想 根据待排序数组a创建一个新的数组count&#xff0c;该数组…

python--实验 11 模块

目录 知识点 模块基础 模块使用方式 自定义模块示例 模块的有条件执行 Python包结构 定义和导入包 常用第三方库及安装 实例代码 第三方库自动安装脚本 Python标准库介绍 PyInstaller 小结 实验 1.(基础题)制作文本进度条。 2.(基础题) 蒙特卡罗方法计算圆周率…

nginx正向代理、反向代理、负载均衡

nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍&#xff08;一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以&#xff09; netstat -antp | grep 80 查端口号 *1、events块&#xff1a;* 配置影响ngi…