首页 > 编程知识 正文

产生死锁的原因以及预防死锁的三种方法,什么是死锁?请给出预防死锁的方法

时间:2023-05-04 13:19:00 阅读:157516 作者:4876

死锁是什么概念,一般是如何发生死锁(deallocks):的,是两个以上的进程(线程)在执行中争夺资源而引起的相互等待的现象。 此时,系统称为发生了死锁,这些永远互相等待的进程(线程)称为死锁进程(线程)。

产生死锁的条件:

1 .排他条件:个资源一次只能用于一个进程(线程)。

2 .请求保留条件:如果一个进程(线程)请求资源并阻塞,则对获得的资源不进行处置。

3 .不剥夺条件:此进程(线程)获得的资源在用完之前不得强制剥夺。

4 .在循环等待条件:或更多个进程(线程)之间形成头尾相连的循环等待资源关系。

死锁举例:

当两个或多个进程或线程通过信号量访问关键资源时,进程a正常执行需要资源1和资源2,如果没有获得足够资源而阻塞,则正好其他进程b正常执行进程B/A放弃自己占有的一部分资源就可以让对方先运行,但谁也没有放弃自己占有的资源。 会发生死锁。

一个多线程框架中使用了十把锁,该如何避免产生死锁

这里提供如下几种避免死锁的思路:

1、创建线程时设置优先级,优先级高的线程先断开锁。 在这种情况下,多线程框架必须具有明确的优先级,而对等线程必须尽量减少冲突锁的存在。

2、对于线程必须使用的所有资源,必须保证一次性申请完成。 如果只有部分资源未能成功申请,则必须释放申请的资源。 互斥锁和条件变量的组合可以临时释放已经占用的锁,并将其阻止在条件变量之上; (此方法效果最好,但应避免动态死锁。)

3、使用读/写锁,确保即使读线程重复占用锁,读取数据也不会为空。 这在写数据的线程少,读数据的线程多的情况下很常见

4、尽量避免颠倒优先顺序。 低优先级线程消耗高优先级线程所需的资源,而高优先级线程消耗CPU时间。 因此,如果低优先级线程无法正常工作,则无法释放资源。 具有较高优先级的线程占用CPU的时间百分比越高,死锁越严重。

避免优先级反转的策略有:

如果临时赋予进入临界区域的线程较高的优先级,使试图进入临界区域的其他线程无法中断已经位于临界区域的线程,则不会发生优先级颠倒。

启用优先级继承机制。 -如果高优先级进程等待由低优先级进程拥有的资源,则低优先级进程可以暂时获得高优先级进程的优先级,并在释放共享资源之后恢复其原始优先级。 嵌入式系统VxWorks采用了这种策略。

使用禁止插队,通过禁止插队保护临界区。 采用该策略的系统只有优先级:和中断禁止.停止优先级两种。 前者是--进程运行时的优先级,后者是在关键区域运行的优先级。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。