死锁问题,4个必要条件+避免死锁

目录

引入

死锁

概念

示例

多把锁

单锁

4个必要条件 

用途 


引入

我们用加锁的方式保证了多个线程访问临界资源时,不会出现数据紊乱的问题

但是,锁的引入,会导致出现其他的问题

死锁

概念

  • 在多线程或多进程的并发环境中,两个或多个进程或线程被永久阻塞,因为它们在等待对方释放资源,而自己却不释放已经占有的资源
  • 进程或线程无法继续执行,而无法自行解除阻塞

示例

多把锁

一个线程可以申请多把锁:

  • 线程A申请了a锁,线程B申请了b锁
  • 但在两个线程释放锁之前,线程A又需要b锁(也就是需要访问b锁范围内的临界区代码),那么A就会等待b锁的释放
  • 但是此时,如果线程B需要用a锁,就会形成死锁了
  • 因为a锁还正在被线程A持有,线程B需要等待a锁的释放
  • 于是,这两个线程就互相等待对方释放锁,但都处于挂起状态,而锁是无法自己释放的,所以他俩只能一直这么等下去

单锁

如果只需要一把锁,也可能会出现死锁问题(当然,这是特殊情况)

  • 如果一个线程已经申请了a锁,在释放锁之前,它又不小心申请了锁 / 把释放锁的函数名unlock写成了lock,就会形成死锁
  • 因为锁已经被持有(虽然这个人是自己),但是lock函数的第一句就是将al赋为0,所以自己持有的状态并不影响lock的执行
  • 他依然会用内存中mutex的0和al的0交换,然后判断失败被挂起
  • 挂起后,线程带走自己的上下文数据,也就是al中的0
  • 这样,锁就丢失了,线程永远也无法等待到锁

4个必要条件 

互斥条件

  • 一个资源每次只能被一个执行流使用
  • (这是基础条件,我们只有使用了互斥锁,才会出现死锁问题)

请求与保持条件

  • 一个执行流因请求资源而阻塞时,对已获得的资源保持不放
  • (也就是既要又要,他不会放弃自己的,又会向别人索要)

不剥夺条件

  • 一个执行流已获得的资源,在末使用完之前,不能强行剥夺
  • (他虽然向别人索要,但只是一种请求,不会也不能强制拿取)

循环等待条件

  • ​​​​​​​若干执行流之间形成一种头尾相接的循环等待资源的关系
  • 也就是说,申请资源的方向要形成环

用途 

因为是必要条件,所以只要这四个条件之一不满足,即可避免死锁问题

比如:

  • 我们只有在必要时才使用锁,并且要将锁的范围尽可能的缩小
  • 在申请别人的资源不成功若干次后,可以考虑先释放掉自己的锁(万一对方就是在等这个锁呢)
  • 尽量在一个锁范围内完成对共享资源的处理,避免出现多个锁 / 严格控制每个线程申请锁的顺序

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

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

相关文章

esxi全称“VMware ESXi

esxi全称“VMware ESXi”,是可直接安装在物理服务器上的强大的裸机管理系统,是一款虚拟软件;ESXi本身可以看做一个操作系统,采用Linux内核,安装方式为裸金属方式,可直接安装在物理服务器上,不需…

数据结构算法-希尔排序算法

引言 在一个普通的下午,小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐,更是要用扑克牌来决定谁是真正的“大老板”。 然而,小明的牌就像刚从乱麻中取出来的那样,毫无头绪。小森的牌也像是被小丑掷…

Agent学习笔记

背景:LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了,ChatGPT很强大,但是也有做不到的东西。例如: 实时查询问题:实时的天气,地理位置,最新新闻报道,现实世界…

十年婚姻·总结八

十年婚姻总结八 女人一生的合伙人不能只是帅哥哥 女人一生的合伙人不能只是帅哥哥 浪漫的本质还是你的筹码。 比如你送男人5万的手表,但你没什么其他筹码(皮肤粗糙蜡黄、没人脉金钱资源、长的胖)。 那个男人会觉得你胡闹,你送的…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…

引用文献算作重复率么【一文读懂】

大家好,今天来聊聊引用文献算作重复率么,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 引用文献算作重复率么 在学术研究和论文撰写过程中,引用文献是不可或缺的一部分小发猫伪…

shell学习1——txt文件备份,文件名加个年月日的后缀,如test.txt对于备份文件为test.txt_20231205

跟B站Up主学习shell脚本——阿铭linux 3461576172505894 需求 txt文件备份,文件名加个年月日的后缀,如test.txt对于备份文件为test.txt_20231205 代码 #!/bin/bash ##定义后缀变量 suffixdate %Y%m%d##找到/test/目录下的txt文件 for f in find /tes…

ubuntu源配置文件/etc/apt/sources.list不存在

若使用命令sudo apt-get update报错:apt-get:找不到命令,八成是源配置文件/etc/apt/sources.list不存在。但是一般来说不会不存在,若真的不小心删除的话,我们也可以进行恢复。 首先创建/etc/apt/sources.list文件,然后…

安卓与串口通信-如何区分连接的设备?

前言与背景 一般来说,不管是在什么平台上需要与外接硬件交互,第一件事都是应该能够正确的识别出目标硬件。 例如在 Windows 上,当一个新的外设设备被插入到我们的电脑时,系统会通过 Hardware IDs 、Compatible IDs 来确定连接的…

看图学源码之 Atomic 类源码浅析二(cas + 分治思想的原子累加器)

原子累加器 相较于上一节看图学源码 之 Atomic 类源码浅析一(cas 自旋操作的 AtomicXXX原子类)说的的原子类,原子累加器的效率会更高 XXXXAdder 和 XXXAccumulator 区别就是 Adder只有add 方法,Accumulator是可以进行自定义运算方…

ufw常用命令解析

命令 举例 解释 ufw enable — 启用防火墙 ufw disable — 禁用防火墙 ufw status — 查看防火墙状态与规则 ufw default ARG sudo ufw default allow sudo ufw default deny 将默认策略设置为允许所有未明确规定的流量 将默认策略设置为拒绝所有未明确规定的流量…

大数据技术5:OLAP引擎对比分析

前言:数据仓库建设,初级的理解就是建表,将业务数据、日志数据、消息队列数据等,通过各种调度任务写入到表里供OLAP引擎使用。但要想建好数仓也是一个复杂、庞大的工程,比如要考虑:数据清洗、数据建模&#…

001 LLM大模型之Transformer 模型

参考《大规模语言模型--从理论到实践》 目录 一、综述 二、Transformer 模型 三、 嵌入表示层(位置编码代码) 一、综述 语言模型目标是建模自然语言的概率分布,在自然语言处理研究中具有重要的作用,是自然 语言处理基础任务之一…

第 119 场 LeetCode 双周赛题解

A 找到两个数组中的公共元素 模拟 class Solution { public:vector<int> findIntersectionValues(vector<int> &nums1, vector<int> &nums2) {unordered_set<int> s1(nums1.begin(), nums1.end()), s2(nums2.begin(), nums2.end());vector<…

【基于大数据的人肥胖程度预测分析与可控策略】

基于大数据的人肥胖程度预测分析与可控策略 前言数据获取与清洗数据挖掘与分类建模1. K-means聚类2. 层次聚类3. DBSCAN4. 分类建模 数据可视化模型肥胖程度预测分析与可控策略结语 前言 随着现代生活方式的改变&#xff0c;肥胖问题逐渐成为全球性的健康挑战。为了更好地理解…

实用篇 | 3D建模中Blender软件的下载及使用[图文详情]

本文基于数字人系列的3D建模工具Blender软件的安装及使用&#xff0c;还介绍了图片生成3D模型的AI工具~ 目录 1.Blender的下载 2.Blender的使用 3.安装插件(通过压缩包安装) 4.实例 4.1.Blender使用MB-Lab插件快速人体模型建构 4.1.1.点击官网&#xff0c;进行下载 4.1.…

批量将图片分别翻转90、180、270度,并将对应的框标注的json文件也进行相应调整,做到数据增强的效果

#------------------------------------矩形标注增强--------------------------------------- from PIL import Image import os import jsondef rotate_images_and_jsons(input_folder):output_folder os.path.join(input_folder, "rotated_images")os.makedirs(o…

在JavaScript中,可以使用Object.assign()方法或展开语法(...)来合并对象

在JavaScript中&#xff0c;你可以使用Object.assign()方法或者使用Spread Operator (…) 来合并对象。 Object.assign() Object.assign() 静态方法将一个或者多个源对象中所有可枚举的自有属性复制到目标对象&#xff0c;并返回修改后的目标对象。 语法 Object.assign(tar…

Java TCP(一对一)聊天简易版

客户端 import java.io.*; import java.net.Socket; import java.util.Date; import javax.swing.*;public class MyClient {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;p…

C语言 题目

1.写一个函数算一个数的二进制(补码)表示中有几个1 #include<stdio.h>//统计二进制数中有几个1 //如13:1101 //需要考虑负数情况 如-1 结果应该是32// n 1101 //n-1 1100 //n 1100 //n-1 1011 //n 1000 //n-1 0111 //n 0000 //看n的变化 int funca(int c){int co…