首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
如何确保N个线程可以访问N个资源同时又不导致死锁?
[问答题]
如何确保N个线程可以访问N个资源同时又不导致死锁?
添加笔记
求解答(0)
邀请回答
收藏(2241)
分享
纠错
59个回答
添加回答
23
西弗斯
多线程
产生死锁
的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用。
保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。
不可剥夺***:进程已获得资源,在未使用完成前,不能被剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要破坏其中任意一个条件,就可以避免死锁,其中最简单的就是破环循环等待条件。按同一顺序访问对象,加载锁,释放锁。
发表于 2016-03-10 22:41:04
回复(3)
9
装逼小王子
预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下三种方法:
1.破坏请求和保持条件,
进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用).
允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。
2.破坏不可抢占条件
这种方法代价大,实现复杂。
3.破坏循坏等待条件
对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。
发表于 2017-07-25 12:35:25
回复(0)
3
Thas
破坏造成死锁的必要条件。线程互斥基本无法避免。
指定加锁顺序。所有线程按照相同的顺序获得资源的锁,不先获得顺序靠前的锁,无法获得后续的锁。则
先获得锁
的线程不会请求
后获得锁
的线程占用的资源,因为
后获得锁
的线程还没能获得
先获得锁
的线程未释放的锁,更无法占用
先获得锁
的线程还没获得的顺序靠后的锁。缺点:需要手动对锁的获得顺序进行分析。
指定加锁时限:线程指定超时时间,若无法获得锁的占用权,进行回退操作,并释放已占用的锁,经一段延时后再尝试进行任务。缺点 :线程过多的话,可能造成频繁回退,运行效率不高。
死锁检测:将线程和已获得锁的情况记录下来,定时检测是否所有死锁现象(线程循环等待现象),回退处于死锁状态的线程,延时后,重试这些线程,与添加加锁时限类似,缺点也同。
编辑于 2019-01-18 16:52:46
回复(0)
2
玄洪
题目说的答案明显没有可行性。有10个线程需要指明每个线程的执行顺序,假如有100个,1000个呢?
发表于 2020-02-04 22:34:19
回复(0)
2
小廿
银行家算法
发表于 2018-11-24 16:40:13
回复(0)
3
SmallWang
死锁,基本就是资源不够,互相需要对方资源却不肯放弃自身资源。N线程访问N资源,为了避免死锁,可以为其加锁并指定获取锁的顺序,这样线程按照顺序加锁访问资源,依次使用依次释放,可以避免死锁。
发表于 2016-08-25 15:48:47
回复(0)
1
荒漠
能否让其一次性获取,其所需要的资源,如果拿不全,就必须退回已近拿到的资源
发表于 2019-03-13 09:27:42
回复(2)
1
小新没有蜡笔~
所有线程按照指定顺序获取锁,释放锁
发表于 2016-10-17 15:08:27
回复(0)
1
阿里云弹性计算工程师
指定线程获取锁的顺序,并强制线程按照指定的方式获取和释放锁。当所有的线程都按顺序获取和释放锁时就不会发生死锁。
发表于 2016-06-17 13:54:23
回复(0)
1
dfsdocx
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
发表于 2015-10-29 12:10:41
回复(0)
61
吹过田野的风
多线程产生死锁需要四个条件,分别是互斥性,保持和请求,不可剥夺性还有要形成闭环,这四个条件缺一不可,只要破坏了其中一个条件就可以破坏死锁,其中最简单的方法就是
线程都是以同样的顺序加锁和释放锁,也就是破坏了第四个条件。
发表于 2016-01-11 21:15:04
回复(9)
0
Tod_
破坏死锁的四个必要条件其中之一: 1. 互斥条件(不可避免) 2. 不可剥夺条件 3. 请求与保持条件 4. 循环等待条件 其中对共享资源进行时,加锁解锁就是破坏第四个条件,最为简单方便
发表于 2021-03-13 08:11:32
回复(0)
0
我且随风前行
<p>所以进程以同样的方式加锁和解锁</p>
发表于 2020-12-08 17:45:49
回复(0)
0
牛客987453813号
https://blog.csdn.net/xuchenhuics/article/details/80011640。如何避免死锁,以及代码
发表于 2020-11-14 00:23:26
回复(0)
0
Assassin丶冷靖
最简单的办法就是使线程按顺序加锁和释放锁
发表于 2020-08-30 11:38:24
回复(0)
0
4A46
说了那么多理论,那么如何让线程按照指定顺序获取锁呢
发表于 2020-08-04 19:19:22
回复(1)
0
ღ᭄ꦿ九璃এ⁵²º᭄
1.破坏请求和保持条件,
进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用).
允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。
2.破坏不可抢占条件
这种方法代价大,实现复杂。
3.破坏循坏等待条件
对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。
发表于 2020-07-20 08:16:40
回复(0)
0
梢无球
死锁:线程拥有彼此继续执行所需要的锁 但又 彼此不释放,从而进入无限等待的状态。
发表于 2020-07-04 16:58:53
回复(0)
0
宋铁松
让线程按照指定的顺序获取或者释放锁可以避免死锁。
发表于 2020-07-01 16:47:20
回复(0)
0
小7小7万事如意
(问答题) 如何确保N个线程可以访问N个资源同时又不导致死锁? 使用多线程的时候,避免死锁的方式可以是:强制线程按照指定的顺序获取锁。如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
编辑于 2020-06-24 18:46:12
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Java
上传者:
墨墨
难度:
59条回答
2241收藏
27403浏览
热门推荐
相关试题
执行以下程序,理论上输出的结果应最...
360集团
Python
算法工程师
2019
评论
(1)
来自
360公司-2019校招...
去耦电容与旁路电容的作用及使用差异点
模拟电路
评论
(1)
什么是竞争与冒险现象?怎样判断?如...
数字电路
评论
(1)
设置信号传输线为什么会串电阻
电路基础
评论
(1)
电子系统中常用的模拟电路及其功能
模拟电路
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题