死锁 + 条件变量 + 生产消费者模型

文章目录

    • 死锁
      • 如何解决死锁问题呢?
      • 避免死锁
    • 同步
      • 概念
      • 1.快速提出解决方案 --- 条件变量
      • 原理
      • 接口
      • 2. CP问题 --- 理论
      • 3. 快速实现CP

死锁

现象 : 代码不会继续往后推进了

问题
一把锁有没有可能产生死锁呢?
有可能
在这里插入图片描述
线程第一次申请锁成功,继续再次申请,第二次申请就失败了,当前线程抱着锁就被挂起了
其他线程申请都失败阻塞了。
1.你抱着锁去休眠了
2.没有人释放锁了
3. 剩余线程申请锁都不成功
所有整个线程全部都卡住了

上面是单执行流,单锁,更一般的情况是多锁,多执行流

一组执行流(这里按多线程说),并发编程时锁可能不止一个,正常编程时各个线程都由调度器自由去申请锁,此时就可能出现问题,一个线程持有一把锁,另一个线程持有另一把锁,但是他们两个却互相申请对方的锁,进而导致一种永久等待的状态,这种状态成为死锁。

所有的死锁都是由于程序员代码写的不太合适或者调度过程中出现异常问题

例子
张三和李四去商店买糖,他们俩每人只有五毛钱,但是棒棒糖一块钱,张三要李四的那五毛,
李四要张三那五毛,他们两个人就在商店这里卡住了。

多线程会产生死锁其实有四个必要条件
什么叫必要条件?
只要产生了死锁必定满足这四个条件,并不代表使用这四个条件百分百产生死锁
反过来理解
只要四个条件中有一个条件不满足就一定不会产生死锁

1.互斥条件
要有死锁的前提肯定是要先用了锁
2.请求与保持条件
比如例子中张三请求李四的五毛钱并且不释放自己的五毛,李四也遵循相同的规则
3.不剥夺条件
张三拿着自己的五毛钱还在请求对方的五毛,但不能强行抢李四的五毛
4.循环等待条件
若干执行流之间形成一种头尾相接的循环等待资源的关系
在这里插入图片描述
我们写的抢票就是遵循互斥条件,有请求与保持,只不过只有一把锁,也有不剥夺条件,但是没产生死锁
因为必须形成环路等待才能产生死锁
在这里插入图片描述

如何解决死锁问题呢?

理念
一旦有死锁必定要同时满足四个必要条件,解决的话必然需要破坏4个必要条件之一

方法
1.代码死锁了,那我重写一下代码我不用锁了那就没有互斥了也没有死锁了

2.请求与不保持
张三问李四要五毛失败了,此时张三把五毛释放了,反正张三也走不到后面买不了棒棒糖
具体怎么操作呢?
之前pthread_mutex_lock 线程申请锁失败后不是立马出错返回而是把自己阻塞住
pthread_mutex_trylock 申请锁如果失败它会立即返回,是申请锁的非阻塞版本
它返回后把锁释放掉然后从新开始申请锁,这样就很容易破坏请求与保持条件
我们用的lock本来就是保持的,你不给我锁我就在这阻塞住,只不过只有一把锁

3.破坏不剥夺条件,那就是要剥夺,剥夺的本质不就是释放对方的锁吗
怎么剥夺呢?
直接释放锁
以前讲解锁的原理不是把以前交换的锁换回去,而是直接把锁置1 了

第一条破坏改动比较大,2,3是通过接口可以实现的

4.环路等待问题,申请资源形成一个环路
在这里插入图片描述

要破坏它通过编码来完成
张三要李四的锁2,李四要张三的锁1,为什么会这样?
谁让你申请锁时不按顺序申请而是交叉着申请,为什么不让两个线程同时申请锁1然后再同时申请锁2。
也就是说你要同时持有两把锁你必须得按顺序申请锁,也就破坏了环路等待问题

避免死锁

破坏死锁的四个必要条件

加锁顺序保持一致
两个线程都按顺序申请锁1锁2,不要倒着来,尽可能减少环路等待

避免锁未释放的场景
写代码锁要尽快释放

资源一次性分配
尽量把资源一次性给线程,不要让线程花了多次持有锁申请资源
一次给它,意味着加锁场景少一些,产生死锁场景就少了

同步

概念

同步问题是保证数据安全的情况下,让我们的线程访问资源具有一定的顺序

同步是为了解决互斥中线程竞争锁的能力强弱不同导致其他线程饥饿问题。
我们之前讲VIP自习室时定的两个原则
1.外面来的,必须排队
2.出来的人,不能立马重新申请锁,必须排到队列的尾部
这只是解决方案之一
在这里插入图片描述
互斥本身就能解决一类问题,只不过可能因为竞争不均衡产生饥饿问题
为了避免饥饿采用同步来解决
不要认为互斥本身是一种问题,要理解成一种解决方案,只不过解决方案有自己的使用场景
,如果互斥不满足我们可以引用同步。

1.快速提出解决方案 — 条件变量

原理

在这里插入图片描述
线程可以申请多个条件变量,凡是能申请多个的这种对象,都要对它做管理,不然我怎么知道去哪个条件变量下排队
则线程库一定要对多个条件变量做管理,怎么管理?先描述在组织
条件变量结构体中一定有一个等待队列是task_struct* wait_queue
还有一个铃铛,当一个线程访问临界资源完了,出来它要去队列中去排队,排队前要先敲一下铃铛,也就是铃铛响了。
其他线程来了如果资源不就绪,也要到队列里等待

线程在排队之前得先申请锁
条件变量必须依赖于锁的使用

接口

条件变量
定义全局,定义局部
和锁的接口差不多
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
如果资源不就绪,让线程去等待队列里去等

在这里插入图片描述
signal 唤醒一个线程
boradcast 唤醒所有队列里的线程


快速看到多线程同步的效果 比如抢票

这里用多线程访问cnt
对cnt做加加,其实就和抢票差不多
我们没管临界资源的状态情况,也就是临界资源就不就绪的问题
在这里插入图片描述
为什么pthread_cond_wait在加锁后面?
1.pthread_cond_wait参数中需要一把锁,它会让线程去指定条件变量中排队的时候,会自动释放这把锁,锁一释放,其他线程也可以成功申请到锁再次进入条件变量中排队(我们是直接让线程去等待队列里排队,而没有看资源是否就绪)
所以等待队列中一定存在大量的线程

2. CP问题 — 理论

3. 快速实现CP

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

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

相关文章

【node】使用 sdk 完成短信发送

实现效果 过程 流程比较复杂,加上需要实名认证,建议开发的时候先提前去认证号账号,然后申请模版也需要等认证。 源码 我看了新版的sdk用的代码有点长,感觉没必要,这边使用最简单的旧版的sdk。 https://github.com/…

智能优化算法应用:基于秃鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于秃鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于秃鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.秃鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

基于ssm电子资源管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 环境: jdk8 tomcat8.5 基于ssm电子资源管理系统源码和论文758 摘要 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门…

在 Linux 系统中安装并设置 kubectl

准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.29 版本的客户端能与 v1.28、 v1.29 和 v1.30 版本的控制面通信。 用最新兼容版的 kubectl 有助于避免不可预见的问题。 在 Linux 系统中安装 kubectl 在 Linux 系统中安装 kubectl 有…

jmeter,http cookie管理器

Http Cookie管理器自动实现Cookie关联的原理: (默认:作用域在同级别的组件) 一:当Jmeter第1次请求服务器的时候,如果说服务器有通过响应头的Set-Cookie有返回Cookie,那么Http Cookie管理器就会自动的保存这些Cookie的值。 二:当Jmeter第2-N次请求服务器的…

Redis 过期删除策略、内存回收策略、单线程理解

不知从何开始Redis的内存淘汰策略也开始被人问及,卷!真的是太卷了。难不成要我们去阅读Redis源码吗,其实问题的答案,在Redis中的配置文件中全有,不需要你阅读源码、这个东西就是个老八股,估计问这个东西是想…

Golang八股文面试题

1、golang 中 make 和 new 的区别?(基本必问) 1.make和new都是golang用来分配内存的內建函 数,且在堆上分配内存, 2.make 即分配内存,也初始化内存。 3.new只是将内存清零,并没有初始化内存。 …

HNU-计算机网络-实验3-应用层和传输层协议分析(PacketTracer)

计算机网络 课程基础实验三应用层和传输层协议分析(PacketTracer) 计科210X 甘晴void 202108010XXX 【给助教的验收建议】 如果是助教,比起听同学读报告,更好的验收方式是随机抽取一个场景(URL/HTTPS/FTP&#xff09…

Vue3-12- 【v-for】循环一个整数

说明 v-for 这个东西就很神奇&#xff0c;可以直接循环一个整数&#xff0c;而且循环的初始值是从1 开始。使用案例 <template><div v-for"(num,indexB) in 6" :key"indexB">【索引 {{ indexB }}】 - 【数字 {{ num }}】 </div></t…

直播传媒公司网站搭建作用如何

直播已然成为抖快等平台的主要生态之一&#xff0c;近些年主播也成为了一种新行业&#xff0c;相关的mcn机构直播传播公司等也时有开业&#xff0c;以旗下主播带来高盈利&#xff0c;而在实际运作中也有一些痛点难题&#xff1a; 1、机构宣传展示难 不少散主播往往会选择合作…

湖农大邀请赛shell_rce漏洞复现

湖农大邀请赛 shell_rce 复现 在 2023 年湖南农业大学邀请赛的线上初赛中&#xff0c;有一道 shell_rce 题&#xff0c;本文将复现该题。 题目内容&#xff0c;打开即是代码&#xff1a; <?phpclass shell{public $exp;public function __destruct(){$str preg_replace…

Vue中this.$nextTick的执行时机

一、Vue中this.$nextTick的执行时机&#xff0c;整体可分为两种情况&#xff1a; 第一种&#xff1a;下一次 Dom 更新之后执行&#xff08;即等待DOM更新结束之后&#xff0c;执行nextTick的延迟回调函数&#xff09;&#xff1b; 第二种&#xff1a;页面挂载后 &#xff08;m…

KaiwuDB × 国网山东综能 | 分布式储能云边端一体化项目建设

项目背景 济南韩家峪村首个高光伏渗透率台区示范项目因其所处地理位置拥有丰富的光照资源&#xff0c;该区域住户 80% 以上的屋顶都安装了光伏板。仅 2022 年全年&#xff0c;光伏发电总量达到了百万千瓦时。 大量分布式光伏并网&#xff0c;在输出清洁电力的同时&#xff0c…

强化学习中训练阶段和测试阶段的区别,在代码上是怎么体现的

强化学习中训练阶段和测试阶段的区别&#xff0c;在代码上是怎么体现的 在强化学习中&#xff0c;训练阶段和测试阶段有一些关键的区别。这主要涉及到探索与利用的平衡、环境交互、以及模型参数更新等方面。以下是训练阶段和测试阶段的主要区别以及在代码中可能如何体现&#…

LeetCode 2454. 下一个更大元素 IV:双单调栈

【LetMeFly】2454.下一个更大元素 IV&#xff1a;双单调栈 力扣题目链接&#xff1a;https://leetcode.cn/problems/next-greater-element-iv/ 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数&#xff0c;你必须找到对应元素的 第二大 整数。 如果 num…

什么是PHP的反射(Reflection)?

PHP的反射&#xff08;Reflection&#xff09;是一组用于在运行时获取和操作PHP代码结构信息的特性和类。反射API允许您分析和操作类、方法、属性、参数等元素&#xff0c;使您能够在运行时检查和修改PHP代码的结构。反射通常用于以下一些情况&#xff1a; 自动化工具&#xff…

k8s 环境中ipvs VS iptables

IPVS vs. iptables 在 Kubernetes 中的区别 特性IPVSiptables类型L4 负载均衡器L3/L4 包过滤层级传输层 (L4)网络层 (L3) 和传输层 (L4)用途服务负载均衡网络流量的包过滤和NAT网络层在第4层操作 (TCP/UDP)在第3层 (IP) 和第4层 (TCP/UDP) 操作负载均衡支持多种负载均衡算法负载…

Gerrit 提交报错missing Change-Id in message footer

直接执行提示的命令&#xff1a; gitdir$(git rev-parse --git-dir); scp -p -P 29418 liyjgerrit.ingageapp.com:hooks/commit-msg ${gitdir}/hooks/ 如果报错&#xff1a; subsystem request failed on channel 0 在.git/hooks目录下看有没有生成commit-msg文件&#xff…

测序名词解释

测序深度&#xff08;Sequencing Depth&#xff09;是指&#xff1a;测序得到的碱基总量&#xff08;bp&#xff09;与基因组&#xff08;转录组或测序目标区域大小&#xff09;的比值&#xff0c;是评价测序量的指标之一。 测序深度的计算公式为&#xff1a; 测序深度 &…

一点技术细节

匈牙利算法&#xff1a; 14-4: 匈牙利算法 Hungarian Algorithm_哔哩哔哩_bilibili 课件&#xff1a;https://github.com/wangshusen/AdvancedAlgorithms.git SWin transformer&#xff1a; Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili patch:灰色 窗口&…