Linux多线程死锁及解决方法

tech2022-08-21  112

先介绍几个概念

线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现线程不安全的问题。重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。

文章目录

死锁概念死锁的四个必要条件避免死锁的几种常用方法

死锁概念

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

举例:若现在有两个线程1和线程2,有A和B两份资源,线程1和线程2的执行都需要AB资源。某一时刻出现某种情况:线程1占用A资源,线程2占用B资源,而线程1需要B资源才能往下执行,线程2需要A资源才能往下执行,这样两个线程互相等待,就出现了最简单的死锁现象

死锁的四个必要条件

互斥条件:一个资源每次只能被一个执行流使用请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系

避免死锁的几种常用方法

想要避免的死锁可以从以下角度考虑:①破坏死锁的四个必要条件 ②加锁顺序一致③避免锁未释放的场景④资源一次性分配

设置等待超时,当一个线程拿起A资源,等待B资源的时候,如果等待的时间过长则超时,释放A资源,重新等待。

如果线程需要AB两个资源,等待A资源的时候阻塞,然后判断B资源是否可以使用,如果B资源正在被别的线程使用,那么该线程就释放A资源,不阻塞,从新排队等待。(银行家算法)

死锁检测算法

最新回复(0)