死锁的代码产生及必要条件与预防
死锁
- 死锁的定义及现象
- 简单的定义
- 复杂的定义
- 死锁的代码及现象
- 死锁的必要条件
- 预防死锁
死锁的定义及现象
简单的定义
当一个执行流获取到互斥锁后,并没有进行解锁,就会导致其他执行流由于获取不到锁资源进行阻塞,将这种现象称为死锁
复杂的定义
当线程A获取到互斥锁1,线程B获取到互斥锁2的时候,线程A和线程B同时还想获取对方手中的所(线程A还想获取互斥锁2,
线程B还想获取互斥锁1),此时就会导致死锁
死锁的代码及现象
1 #include <stdio.h>2 #include <unistd.h>3 #include <pthread.h>4 5 #define THREAD_NUM 26 7 //定义变量8 pthread_mutex_t lock_1;9 pthread_mutex_t lock_2;10
W> 11 void* MyThreadA(void* arg)12 {13 //拿到锁114 pthread_mutex_lock(&lock_1);15 sleep(2);16 //为了让线程B创建出来时锁2还没有被线程A拿走17 pthread_mutex_lock(&lock_2);//拿锁218 return NULL;19 }20
W> 21 void* MyThreadB(void* arg)22 {23 //拿到锁224 pthread_mutex_lock(&lock_2);25 pthread_mutex_lock(&lock_1);//拿锁126 return NULL;27 }28 29 int main()30 {31 //初始化32 pthread_mutex_init(&lock_1, NULL);33 pthread_mutex_init(&lock_2, NULL);34 35 //执行线程36 pthread_t tid_A, tid_B;37 pthread_create(&tid_A, NULL, MyThreadA, NULL);38 pthread_create(&tid_B, NULL, MyThreadB, NULL);39 40 //等待41 pthread_join(tid_A, NULL);42 pthread_join(tid_B, NULL);43 44 //释放45 pthread_mutex_destroy(&lock_1);46 pthread_mutex_destroy(&lock_2);47 48 return 0;49 }
死锁的必要条件
1、不可剥夺:执行流获取了互斥锁后,除了自己主动释放锁,其他执行流不能解锁该互斥锁2、循环等待3、互斥条件:一个互斥锁只能被一个执行流在同一时刻拥有4、请求与保持:“吃着碗里看着锅里”
预防死锁
1、破坏必要条件:循环等待或者请求与保持2、加锁顺序一致3、避免锁没有被释放4、资源一次性分配
死锁的代码产生及必要条件与预防相关推荐
- 死锁产生的四个必要条件
一.死锁产生的四个必要条件 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放 ...
- 什么是死锁? 产生死锁的必要条件?怎样预防和避免死锁?
1. 什么是死锁? 当 多个进程 在运行过程中 因为争夺资源 而造成的一种僵局, 当进程处于这种僵持状态的时候, 若无外力作用, 它们将永远无法向前推进. 这种状态就称为死锁 2. 产生死锁的必要条件 ...
- 死锁产生的4个必要条件?
死锁产生的4个必要条件? 1 . 产生死锁的必要条件: (1)互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用. (2)请求和保持条件:当进程因请求资源而阻塞时,对 ...
- 【操作系统】什么是死锁,以及死锁产生的原因和必要条件
一.什么是死锁? 所谓死锁,就是在两个或多个并发进程中,如果每个进程持有某种资源而又都等待着别的进程释放它或它们现在保持着的资源,否则就不能向前推进,此时每个进程都占用了一定的资源但又都不能向前推进, ...
- 死锁示例代码_Java示例中的死锁
死锁示例代码 Deadlock in java is a programming situation where two or more threads are blocked forever. Ja ...
- 什么是死锁?死锁产生的四个必要条件?如何避免与预防死锁?
一:什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进.例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又 ...
- 什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进.例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出 ...
- 死锁产生的4个必要条件,如何检测,解除死锁
死锁的四个必要条件 操作系统中有若干进程并发执行,它们不断申请.使用.释放系统资源,虽然系统的进 程协调.通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能 继续运行,否则就阻 ...
- Java多线程环境检测系统中是否存在死锁和死锁恢复代码示例
文章目录 ManagementFactory介绍 死锁检测与恢复介绍 代码 公共资源类 导致死锁的模型 模型实现类 模拟死锁的程序类 ManagementFactory介绍 关于ManagementF ...
最新文章
- 使用Python,OpenCV制作图像Mask——截取ROIs及构建透明的叠加层
- 【数据结构】邻接表的储存结构 建立图的邻接表算法
- ExtJs中表格用例代码
- 解决Win8.1系统LYNC共享PPT提示“演示文稿遇到问题”
- Robot Framework-Ride界面介绍及库的添加
- JAVA实现一个图片上传预览功能
- js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域
- 六级词汇打卡第三天(三)
- oracle存储过程id递增,oracle存储过程——按id更新相关信息
- [转载] Java中如何在方法中return返回多个值
- 计算机名汉字 oracle,修改计算机名对ORACLE的影像
- 天文软件ds9对图片调整颜色和两张图片坐标自动匹对
- postgresql mysql数据类型_postgresql+java数据类型对照
- XP下使用submit text3遭遇死机强制重启导致以及代码数据丢失(无法读取源文件或磁盘)
- Noi2001 食物链(入门oj Problem 1706)
- 第一章,用行列式解线性方程组,02-二阶与三阶行列式
- 黎曼Zeta函数,人类文明永恒的纪念
- 函数6:lambda 表达式
- 测试分类方法(含常见面试题)
- SEO的工作内容是什么?
热门文章
- Mac IDEA解决Maven项目命令行报错:command not found: mvn
- python使用sql读取数据表并返回dataframe
- 开源项目选择许可证License
- NLTK使用英文词性还原
- java 同步 实例_Java 1.4同步:仅允许方法的一个实例运行(非...
- 单体预聚合的目的是什么_第七章 配位聚合
- spring学习笔记四(注入Bean属性)
- 在Tomcat启动时直接创建servlet(二)
- Android状态选择器用法总结
- 怎么监听Android软键盘的打开和关闭