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

文章目录

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

死锁的基本概念

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

死锁的四个必要条件

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

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

避免死锁

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

避免死锁的算法

死锁检测算法

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说,越来越多企业开始应用WMS进行系统化的管理,以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍,希望对你有帮助。 一、业务流程 。在线下业务流程拓展,仓库不断增多的过程中,由于…

docker私有仓库harbor安装

Harbor默认安装 下载harbor https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz 目前要求docker版本,docker 20.10.10-ce ,和docker-compose 1.18.0 查看 docker-compose版本 docker-compose --ver…

【Python】Python模块及常用模块介绍

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言Python 模块(Module)模块的作用模块的创建模块的引入import 语句from…import 语句from…import* 语句 搜索路径常用模块[Python 标准库](https://docs.python.org/zh-cn/3/li…

Android中RecyclerView使用详解(一)

目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter,泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…

STM32基础篇:EXTI × 事件 × EXTI标准库

EXTI EXTI简介 EXTI:译作外部中断/事件控制器,STM32的众多片上外设之一,能够检测外部输入信号的边沿变化并由此产生中断。 例如,在检测按键时,按键按下时会使电平产生翻转,因此可以使用EXTI来读取按下时…

Kotlin Misk Web框架

Kotlin Misk Web框架 1 Misk 框架介绍2 Misk/SpringBoot 框架对比3 Misk 添加依赖/配置3.1 build.gradle.kts3.2 settings.gradle.kts3.3 gradle.properties 4 Misk 请求接口5 Misk 程序模块6 Misk 主服务类7 Misk 测试结果 1 Misk 框架介绍 Misk 是由 Square 公司开发的一个开…

Python:while循环

while循环体 while 条件: 符合条件执行语句 .... 执行完后需执行的语句 # while循环 i1 while i<5:print(i)ii1 print("Done") test. 做一颗圣诞树吧 答案&#xff1a; # while循环 i 1 j5 while i < 5:print( * j* * i)i i 2jj-1 print("Done"…

【Python百日进阶-Web开发-音频】Day702 - librosa安装及模块一览表

文章目录 一、Librosa简介与安装1.1 Librosa是什么1.2 Librosa官网 二、Librosa安装2.1 安装Librosa 三、安装ffmpeg3.1 ffmpeg官网下载3.2 ffmpeg安装3.2.1 解压3.2.2 添加环境变量3.2.3 测试ffmpeg是否安装成功 四、Librosa 库模块一览4.1 库函数结构4.2 Audio processing&am…

Redis-linux下安装redis7配置

Redis安装配置 Redis安装配置一、Linux环境安装Redis必须先具备gcc编译环境1.什么是gcc 二、版本选择三、Redis7安装步骤1.下载2./opt目录下解压redis3.执行make命令4.查看默认安装目录:usr/local/bin5.初始化设置redis.conf6.启动服务7.连接服务8.关闭服务9.卸载redis Redis安…

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

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

施耐德EOCR系列电机保护器全面升级后無端子型

一、施耐德数码型产品升级背景 施耐德电气作为一家全球领先的能源管理和自动化解决方案提供商&#xff0c;其产品线包括各种电动机保护器等数码型产品。随着技术的不断发展和市场需求的变化&#xff0c;施耐德会对其产品进行定期升级和优化。在升级过程中&#xff0c;产品的设…

前后端通信 —— HTTP/HTTPS

目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法&#xff08;常用&#xff09; 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码&#xff08;常用&#xff09; …

Linux多线程编程-生产者与消费者模型详解与实现(C语言)

1.什么是生成者与消费者模型 生产者-消费者模型是并发编程中的经典问题&#xff0c;描述了多个线程&#xff08;或进程&#xff09;如何安全、有效地共享有限的缓冲区资源。在这个模型中&#xff0c;有两种角色&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1…

牛客周赛 Round 51 解题报告 | 珂学家

前言 题解 典题场&#xff0c; EF都有很多种解法 A. 小红的同余 性质: 相邻两数互质 x ( m 1 ) / 2 x (m1)/2 x(m1)/2 m int(input())print ((m 1) // 2)B. 小红的三倍数 性质: 各个位数之和是3的倍数&#xff0c;可被3整除 和数的组合顺序无关 n int(input()) arr…

Mysql数据表的约束(下)

3.默认值约束(default) 与非空约束的命令一致,因为都属于列级约束,因此只需将not null改为default 默认值即可 删除默认值约束: 4.主键约束(primary key) 表示给一张表格设置了一个唯一标识,为了更快的去通过唯一的数据去准确的查找到每一条记录,一半咱们在创建表…

Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152位支持,保障网络安全。同时支持MAC地址认证、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全机制,…

昇思25天学习打卡营第15天|基于MobileNetv2的垃圾分类

一、关于MobileNetv2 MobileNet网络专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小幅度降低的前提下&#xff0c;大大减小了模型参数与运算量。并引入宽度系数 α和…

Paddle 打包部署

PaddleOCR 打包部署exe 心酸历程 PaddleOCR部署exe模式PaddleOCR安装到本地(稍后有时间再写)PaddleOCR打包过程异常问题记录&#xff01;&#xff01;&#xff01;&#xff01;No such file or directory: D:\\py_project\\paddleOCR\\dist\\paddleOCR\\_internal\\paddleocr\\…

如何指定多块GPU卡进行训练-数据并行

训练代码&#xff1a; train.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import torch.nn.functional as F# 假设我们有一个简单的文本数据集 class TextDataset(Dataset):def __init__(self, te…

Linux系统密码重置

实验环境&#xff1a; Centos 7.9 背景&#xff1a; 找回root用户密码 1、首先&#xff0c;启动Linux系统进入开机界面&#xff0c;在界面中快速点击‘e’进入编辑界面&#xff0c;如图&#xff1a; 2、进入编辑界面会后往下翻找到“Linux16”内容所在的行数&#xff0c;在&q…