网站的建设好处,app下载软件电脑版安装,快速建站服务器,中国人自己的空间站提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、死锁出现的典型场景二、产生 死锁 的必要条件 三、解决 死锁 问题的办法 总结前言
今天对于多线程进阶的学习#… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、死锁出现的典型场景二、产生 死锁 的必要条件 三、解决 死锁 问题的办法 总结前言
今天对于多线程进阶的学习今天我们今天来介绍有关死锁的内容熟练的掌握死的出现场景产生死锁的必要条件解决死锁的方法等等
死锁是多线程中的一个比较典型的问题是多线程代码中的常见 bug
通俗的说就是 在尝试加锁的时候发现上次锁没有及时的释放由于某些原因或是是一些代码的 bug 导致加锁没有加上
于是就会出现了 死锁 问题 一、死锁出现的典型场景
一一个线程一把锁可重入锁若是不可重复锁凉
一个线程一把锁这个就是之前所介绍的 可重入锁
线程A 针对锁1 连续加锁两次就构成了死锁 ! 第一次加锁 加锁成功第二次加锁 就需要第一次的锁释放于是就阻塞等待 但是第一次加锁释放就得依赖第二次加锁成功 于是死锁 就出现了 二两个线程两把锁相互获取对方锁凉
此时不管是不是可重入锁都会造成 死锁 问题 举例说明 假设 甲同学 和 乙同学 居住在一起了 甲同学 吃饺子喜欢蘸酱油乙同学 吃饺子喜欢蘸醋由于在一起了生活习性都受到了彼此的影响两位同学吃饺子的时候 喜欢都蘸上一点了 有一天吃饺子的时候甲同学拿起了酱油乙同学拿起了醋 甲同学说你把醋给我我用完了都给你乙同学说你把酱油给我我用完了就把醋给你 此时两者相持不下这就造成了 死锁 问题 此时甲同学 和 乙同学 就可以看成是两个线程酱油和醋 就可以看成是两把锁 ~ 线程1 获取到锁A线程2 获取到锁B 线程1 尝试获取锁B需要线程2 释放锁B 线程2 尝试获取到锁A需要线程1 释放锁A 在这种情况下逻辑上就构成了循环就构成了 死锁 三多个线程多个锁哲学家就餐问题凉
此时这种情况和 第二种情况 类似只是更复杂一点而已 ~
在多个线程多把锁的情况下死锁问题 就是一个概率性的问题但是也绝对不能忽视
在谈到 多个线程多把锁 的时候就会引出一个很经典的问题 —— 哲学家就餐问题 故事背景 有 5 个哲学家相当于有 5 个线程他们只会做两件事情 思考人生相当于是 线程休眠 吃面条相当于是 在CPU上运行 由于多线程的调度是无序的所以说 这几个哲学家 什么时候去思考人生什么时候去吃面条我们是不确定的 同时正常情况下应该会有 5 双筷子 但是此时 在餐桌上 一共只有 5 根筷子并且 这5 根筷子 分别在 两两哲学家 之间 并且他们之间都不相互嫌弃吃面条的时候要拿起 左右手两双筷子这就导致相邻的哲学家需要等待 此处的筷子就视为 两把锁只有这两把锁都获取到了才可以吃面条 出现 死锁 问题的情况 假设 在同一时刻所有的哲学家都想吃面条 他们同时伸出左手拿起左边的筷子然后又同时伸出右手尝试去拿右边的筷子此时右手的筷子都拿不起来因此都无法吃面 由于哲学家都非常固执导致即使吃不到面条 也不会放下左手的筷子这样的情况就会一直持续下去 于是这就构成了死锁 二、产生 死锁 的必要条件 鉴于 死锁问题程序员大佬们 总结了 4 个 死锁产生的必要条件 1.互斥使用线程1 拿到锁A其他线程就无法获取到 A 2.不可抢占线程1 拿到锁A其他线程只能阻塞等待等到线程1 主动释放锁而不是强行把锁抢走 3.请求和保持当线程1 拿到锁A 之后就会一直持有这个获取到锁的状态直到说主动释放锁 4.循环等待线程1 等待线程2线程2 又尝试等待线程1 三、解决 死锁 问题的办法
根据 产生 死锁 的必要条件我们可以知道前三个必要条件 都是在描述锁的基本特点在实际情况下 我们并不好直接去破坏
但是第四个必要条件 却是和代码编写密切相关
如果我们能够在编码上做出一些注意和约定就可以打破 循环等待避免死锁 打破 循环等待 的办法 针对多把锁进行编号1、2、3、4、...... 并且约定在获取多把锁的时候要明确获取锁的顺序是 从小到大或者 从大到小 的顺序 ~ 如此处以从小到大为例 线程要拿到 1、2 这两把锁就先获取 1再获取 2 线程要拿到 2、4 这两把锁就先获取 2再获取 4 ~ 只要所有的线程都遵循这个顺序就不会出现 循环等待就不会出现死锁 我们可以把这个解决办法 带入到上面的 哲学家就餐问题 看看
约定获取所得顺序是从小到大 之后最左边的哲学家 就可以得到两把锁了于是就可以吃到面条了 等到 吃完面条之后会释放 4、5两把筷子然后 最上面的哲学家 也可以吃到面条了......就这样的话顺时针旋转依次 5 位哲学家都可以吃上面条了 谁最先吃到面条谁最后吃到面条一眼就可以看明白了 于是循环等待就被打破了死锁问题就被解决了 这种解决 死锁问题 的方法非常可靠也非常的重要 总结
提示这里对文章进行总结 例如以上就是今天要讲的内容本文仅仅简单介绍了pandas的使用而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。