[ Linux ] 死锁以及如何避免死锁

news2025/1/15 12:45:00

目录

1.什么是死锁?

死锁

2.模拟死锁情况

3.死锁四个必要条件

4.避免死锁的方法

5.避免死锁的算法

银行家算法(了解为主)


1.什么是死锁?

死锁

  • 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待的状态。

2.模拟死锁情况

我们使用多线程模拟一个死锁的情况。

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <mutex>

using namespace std;

pthread_mutex_t mutexA = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutexB = PTHREAD_MUTEX_INITIALIZER;
void* startRoutine1(void* args)
{
    while(true)
    {
        pthread_mutex_lock(&mutexA);
        sleep(1);
        pthread_mutex_lock(&mutexB);
        cout<<"我是线程1,我的tid"<<pthread_self()<<endl;
        pthread_mutex_unlock(&mutexB);
        pthread_mutex_unlock(&mutexA);
    }

}

void* startRoutine2(void* args)
{
  while(true)
    {
        pthread_mutex_lock(&mutexB);
        sleep(1);
        pthread_mutex_lock(&mutexA);
        cout<<"我是线程2,我的tid"<<pthread_self()<<endl;
        pthread_mutex_unlock(&mutexB);
        pthread_mutex_unlock(&mutexA);
    }
}


int main()
{
    pthread_t t1,t2;

    pthread_create(&t1,nullptr,startRoutine1,nullptr);
    pthread_create(&t2,nullptr,startRoutine2,nullptr);
    
    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    return 0;
}

当上面这段程序运行起来时,线程1和线程2会同时调用各自的startRountine函数,由于mutexA和mutexB均为临界资源只有一份,而在程序中,线程1会先申请mutexA,线程2会先申请mutexB,而当他们申请结束时都会等待1秒(这里等待一秒是确保两个线程各自占有一把锁),一秒休眠结束后,当线程1想要申请mutexB时,由于mutexB已经被线程2占有且未释放,因此线程1将阻塞等待mutexB的释放;同理,线程2也会阻塞等待mutexA。此时,各线程均占有不会释放的资源mutex,并且互相申请了其他线程所占用不会释放的资源而除以一种永久等待的状态。我们把这种状态就称为死锁。当程序运行起来时,我们也能看到程序并没有什么打印结果.....

我们使用监控脚本查看3个线程任然在运行之中

while :; do ps -aL | grep mythread ; sleep 1;echo "---------------";done

3.死锁四个必要条件

死锁的必要条件:死锁情况一旦发生,这四个条件一定都要满足。如果有一个没有产生,那死锁的条件便不成立。

  1. 互斥条件:一个资源每次只能被一个执行流使用
  2. 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不败
  3. 不剥夺条件:一个执行流已获得的资源,在未使用完之前,不能强行剥夺
  4. 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系

4.避免死锁的方法

  • 破坏死锁的四个必要条件
  • 加锁顺序一致
  • 避免锁未释放的场景
  • 资源一次性分配

5.避免死锁的算法

银行家算法(了解为主)

我们在当时将锁的时候,查看过pthread_mutex_lock和pthread_mutex_unlock函数,我们也使用了,那么大家还记不记得其中还有一个trylock。这个函数就是用来尝试申请,如果是安全序列则会正式分配,否则不会分配。

核心思想:

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

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

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

相关文章

Android入门第54天-SQLite中的Transaction

简介 上一篇我们完整的介绍了SQLite在Android中如何使用&#xff0c;今天我们要来讲一下“Transaction“即事务这个问题。 我们经常在编程中会碰到这样的业务场景&#xff1a; 没问题一系列有业务关联性表操作的数据一起提交&#xff1b;事务中只要有一步有问题&#xff0c;那…

PCL 点云最小生成树(MST,Dijkstra算法)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 之前使用过Kruskal算法创建过最小生成树(Open3D 点云最小生成树算法(MST,Kruskal算法)),这里使用另一种算法(Dijkstra算法)来实现创建一个最小生成树,原始的Dijkstra算法并不适用于去生成最小生成树,因此…

xxe-lab靶场安装和简单php代码审计

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是xxe-lab靶场安装和简单php代码审计。 一、xxe-lab靶场简介 xxe-lab是一个使用java、python、php和C#四种编程语言开发的存在xxe漏洞的web小型靶场。利用该靶场可以简单研究xxe漏洞&#xff0c;并且对于这四种编…

Win10微软输入法打不出汉字?

在Win10系统中自带的微软输入法无需再安装其他拼音输入法就可以轻松输入汉字&#xff0c;非常方便&#xff0c;但是有的用户却遇到了Win10专业版自带的微软输入法打不出汉字的问题&#xff0c;这要如何解决呢&#xff1f;有需要的用户就来一起看看吧。 1、点击系统左下侧的wind…

Allegro如何更改铜皮的网络操作指导

Allegro如何更改铜皮的网络操作指导 在做PCB设计的时候需要更改铜皮的网络,Allegro上可以快速的更改铜皮的网络。如下图,需要给铜皮赋上网络 具体操作如下 选择selcet shape命令选中铜皮

会计毕业生的转行之路:坚持无畏,我是我自己的英雄

有时候&#xff0c;我们面对困境&#xff0c;总会犹豫&#xff0c;不敢迈出一步。 但当我们真的鼓起勇气打破困局时&#xff0c;才会发现出路就在眼前&#xff0c;原来只要不放弃&#xff0c;一切皆有可能。 初遇&#xff1a;会计生大四想转行 我是一名来自内蒙古的少数民族女生…

还有1个月,乘用车搭载首超5百万辆!L2/L2+前装交付一路狂奔

高工智能汽车研究院监测数据显示&#xff0c;2022年1-11月中国市场&#xff08;不含进出口&#xff09;乘用车交付上险为1745.95万辆&#xff0c;同比上年同期下滑4.01%&#xff0c;降幅和1-10月数据相比&#xff0c;继续放大&#xff0c;显示市场回暖低于预期。 不过&#xff…

单商户商城系统功能拆解52—财务概况

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

连接稳定性最好的蓝牙耳机有哪些?盘点2023年值得入手的蓝牙耳机

2022年已准备过完&#xff0c;马上来临2023新的一年&#xff0c;大家入手了蓝牙耳机吗&#xff1f;要我说&#xff0c;一款好用的蓝牙耳机不仅只有音质、蓝牙技术、配置性能等&#xff0c;也不能缺少佩戴体验&#xff0c;要想长时间佩戴耳机听歌通话、玩游戏和运动这些&#xf…

白话说Java虚拟机原理系列【第四章】:内存结构之方法区详解

文章目录执行引擎内存结构&#xff1a;运行时数据区方法区(永久代PermGen)方法区的设计初衷&#xff1f;方法区存的什么内容&#xff1f;方法区的异常&#xff1a;运行时常量池&#xff1a;方发表&#xff1a;这里我们详细讲解前导说明&#xff1a; 本文基于《深入理解Java虚拟…

斩获数亿元B轮融资,这家Tier 1抢跑「L2/L2+」主战场

伴随着汽车智能化演进加速&#xff0c;L2/L2&#xff0b;辅助驾驶功能已经成为各家车企抢夺市场的“要塞”。 据高工智能汽车研究院监测数据显示&#xff0c;今年1-9月前装标配搭载L2级辅助驾驶搭载量为395.19万辆&#xff0c;同比增长69.53%&#xff0c;前装搭载率为27.69%。…

倒角算法推导

推导原理基本很简单&#xff1a; 已知AB&#xff0c; BC两条线段&#xff0c;且交于B点&#xff0c;求倒角半径为 L&#xff0c;AB&#xff0c;BC的倒角 以最短边&#xff08;假定为AB&#xff09;长 LAB&#xff0c; 在BC中&#xff0c;以B为起点&#xff0c;找出与LAB同长度…

FOC算法与SVPWM技术

最近看到了FOC这个东西&#xff0c;感觉很有意思&#xff0c;想着以后用这个算法做个东西&#xff0c;目前的想法是用开源的ODrive方案&#xff0c;自己做一个有感单电机驱动的板子&#xff0c;并且加入一点自己的东西&#xff0c;但是这不是目前工作的重点&#xff0c;所以就先…

基于Vue+Element实现的电商后台管理系统的前端项目,主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理

前言 该项目为前后端分离项目的前端部分&#xff0c; 项目介绍 mall-admin-web是一个电商后台管理系统的前端项目&#xff0c;基于VueElement实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等功能。 完整…

MySQL面试常问问题(锁 + 事务) —— 赶快收藏

目录 1.MySQL中有哪几种锁&#xff0c;列举一下&#xff1f; 2.说说InnoDB里的行锁实现? 3.意向锁是什么知道吗&#xff1f; 4.MySQL的乐观锁和悲观锁了解吗&#xff1f; 5.MySQL 遇到过死锁问题吗&#xff0c;你是如何解决的&#xff1f; 6.MySQL 事务的四大特性说一下…

ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了

作者&#xff1a;符****尧、彭昊、Tushar Khot、郭志江等**** 符尧&#xff08;yao.fued.ac.uk&#xff09;&#xff0c;爱丁堡大学 (University of Edinburgh) 博士生&#xff0c;本科毕业于北京大学。他与彭昊、Tushar Khot在艾伦人工智能研究院 (Allen Institute for AI) 共…

jQuery 插件开发

文章目录jQuery 插件开发插件概述常用插件文本溢出&#xff1a;dotdotdot.js单行文本省略多行文本省略延迟加载&#xff1a;lazyload.js插件编写方法类插件函数类插件jQuery 插件开发 插件概述 jQuery插件可以理解成是使用jQuery来封装的一个功能或特效。 一般来说&#xff…

【我亲身经历的2022年软件质量工作】

软件危机&#xff08;softwarecrisis&#xff09;&#xff0c;20世纪60年代以前&#xff0c;计算机刚刚投入实际使用&#xff0c;软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制&#xff0c;采用密切依赖于计算机的机器代码或汇编语言&#xff0c;软件的规模…

如何避免编程从入门到放弃?

写代码不是什么太需要创造力的劳动&#xff0c;现在的代码从业者本质上与工业时代的纺织工人没什么差异。大多数人写代码也并不是真的有兴趣&#xff0c;只不过金钱的诱惑使然&#xff0c;这没什么不好&#xff0c;也十分正确。 但对于零基础转行编程的人来说&#xff0c;坚持下…

关于居住办公人口的统计技术解决方案

在数字化转型的浪潮下&#xff0c;大数据产业作为城市数字化转型的重要助力&#xff0c;带来了城市管理手段、模式、理念的深刻变革与创新。为了更好地了解国家城镇的职住分布结构&#xff0c;帮助城市管理部门制定更加合理的规划策略&#xff0c;为城市商业产业提供有效的规划…