首页 > 试题广场 >

如何确保N个线程可以访问N个资源同时又不导致死锁?

[问答题]
如何确保N个线程可以访问N个资源同时又不导致死锁?
使用多线程的时候,一种非常简单避免死锁的方法是:规定获取锁的顺序,并强制所有的线程按照这个顺序去获取锁。因此,如果所有的线程都按照这个顺序去获取和释放锁,就可以避免死锁了(破坏了循环等待条件)
发表于 2018-04-16 08:32:31 回复(0)
更多回答
多线程产生死锁的四个必要条件:
  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。
  3. 不可剥夺***:进程已获得资源,在未使用完成前,不能被剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要破坏其中任意一个条件,就可以避免死锁,其中最简单的就是破环循环等待条件。按同一顺序访问对象,加载锁,释放锁。
发表于 2016-03-10 22:41:04 回复(3)
预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下三种方法:
          1.破坏请求和保持条件,
               进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用).
               允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。
          2.破坏不可抢占条件
               这种方法代价大,实现复杂。
          3.破坏循坏等待条件
               对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。 
发表于 2017-07-25 12:35:25 回复(0)

破坏造成死锁的必要条件。线程互斥基本无法避免。

  1. 指定加锁顺序。所有线程按照相同的顺序获得资源的锁,不先获得顺序靠前的锁,无法获得后续的锁。则先获得锁的线程不会请求后获得锁的线程占用的资源,因为后获得锁的线程还没能获得先获得锁的线程未释放的锁,更无法占用先获得锁的线程还没获得的顺序靠后的锁。缺点:需要手动对锁的获得顺序进行分析。
  2. 指定加锁时限:线程指定超时时间,若无法获得锁的占用权,进行回退操作,并释放已占用的锁,经一段延时后再尝试进行任务。缺点 :线程过多的话,可能造成频繁回退,运行效率不高。
  3. 死锁检测:将线程和已获得锁的情况记录下来,定时检测是否所有死锁现象(线程循环等待现象),回退处于死锁状态的线程,延时后,重试这些线程,与添加加锁时限类似,缺点也同。
编辑于 2019-01-18 16:52:46 回复(0)
题目说的答案明显没有可行性。有10个线程需要指明每个线程的执行顺序,假如有100个,1000个呢?
发表于 2020-02-04 22:34:19 回复(0)

银行家算法

发表于 2018-11-24 16:40:13 回复(0)
死锁,基本就是资源不够,互相需要对方资源却不肯放弃自身资源。N线程访问N资源,为了避免死锁,可以为其加锁并指定获取锁的顺序,这样线程按照顺序加锁访问资源,依次使用依次释放,可以避免死锁。
发表于 2016-08-25 15:48:47 回复(0)
能否让其一次性获取,其所需要的资源,如果拿不全,就必须退回已近拿到的资源
发表于 2019-03-13 09:27:42 回复(2)
所有线程按照指定顺序获取锁,释放锁
发表于 2016-10-17 15:08:27 回复(0)
指定线程获取锁的顺序,并强制线程按照指定的方式获取和释放锁。当所有的线程都按顺序获取和释放锁时就不会发生死锁。
发表于 2016-06-17 13:54:23 回复(0)
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
发表于 2015-10-29 12:10:41 回复(0)
多线程产生死锁需要四个条件,分别是互斥性,保持和请求,不可剥夺性还有要形成闭环,这四个条件缺一不可,只要破坏了其中一个条件就可以破坏死锁,其中最简单的方法就是线程都是以同样的顺序加锁和释放锁,也就是破坏了第四个条件。
发表于 2016-01-11 21:15:04 回复(9)
破坏死锁的四个必要条件其中之一: 1. 互斥条件(不可避免) 2. 不可剥夺条件 3. 请求与保持条件 4. 循环等待条件 其中对共享资源进行时,加锁解锁就是破坏第四个条件,最为简单方便
发表于 2021-03-13 08:11:32 回复(0)
<p>所以进程以同样的方式加锁和解锁</p>
发表于 2020-12-08 17:45:49 回复(0)
https://blog.csdn.net/xuchenhuics/article/details/80011640。如何避免死锁,以及代码
发表于 2020-11-14 00:23:26 回复(0)
最简单的办法就是使线程按顺序加锁和释放锁
发表于 2020-08-30 11:38:24 回复(0)
说了那么多理论,那么如何让线程按照指定顺序获取锁呢
发表于 2020-08-04 19:19:22 回复(1)
          1.破坏请求和保持条件,
               进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用).
               允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。
          2.破坏不可抢占条件
               这种方法代价大,实现复杂。
          3.破坏循坏等待条件
               对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。 
发表于 2020-07-20 08:16:40 回复(0)
死锁:线程拥有彼此继续执行所需要的锁 但又 彼此不释放,从而进入无限等待的状态。
发表于 2020-07-04 16:58:53 回复(0)
让线程按照指定的顺序获取或者释放锁可以避免死锁。
发表于 2020-07-01 16:47:20 回复(0)
(问答题) 如何确保N个线程可以访问N个资源同时又不导致死锁? 使用多线程的时候,避免死锁的方式可以是:强制线程按照指定的顺序获取锁。如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
编辑于 2020-06-24 18:46:12 回复(0)