博客
关于我
【Linux】死锁
阅读量:498 次
发布时间:2019-03-07

本文共 1197 字,大约阅读时间需要 3 分钟。

#死锁分析及避免方法

死锁是多个执行流在逻辑上相互等待对方完成某个操作,但无解锁点的情况。在多线程环境中,死锁是唯一的并发控制问题。

##死锁类型

  • 单独锁的死锁
  • 当有一个互斥锁被多个线程竞争,且某个线程获取锁后长时间不释放,会导致其他线程无法获取该锁而被阻塞。

    1. 多锁死锁
    2. 多个线程同时拥有互斥锁,并且它们之间互相等待对方释放对方的锁,形成无法继续进行的状态。

      ##死锁分析

      给出的代码中有两个互斥锁:

      pthread_mutex_t lock1;
      pthread_mutex_t lock2;

      两个线程分别执行Threadlock1和Threadlock2函数:

      void* Threadlock1(void* arg){
      (void)arg;
      pthread_mutex_lock(&lock1);
      sleep(2);
      pthread_mutex_lock(&lock2);
      pthread_mutex_unlock(&lock2);
      pthread_mutex_unlock(&lock1);
      return NULL;
      }
      void* Threadlock2(void* arg){
      (void)arg;
      pthread_mutex_lock(&lock2);
      sleep(2);
      pthread_mutex_lock(&lock1);
      pthread_mutex_unlock(&lock1);
      pthread_mutex unlocking(&lock2);
      return NULL;
      }

      分析发现,Threadlock1先获取lock1然后lock2,再成功释放锁'. Threadlock2同理。未发现死锁现象,因为每个线程获取完锁后又都释放。

      ##避免死锁的方法

    3. 防止可被阻塞的进入点
    4. 确保不会在没有解锁点断开的方法中改变状态

      1. 加锁顺序一致
      2. 避免同时加锁或加锁顺序不清晰带来等待

        1. 理解解锁条件
        2. 所有可能导致线程退出的地方必须释放锁

          死锁常由以下四个条件引起:

        3. 互斥条件
        4. 只有一个线程能进入临界区

          1. 请求与保持
          2. 一个线程在获取锁的时候长时间等待,没有及时释放或解锁

            1. 不可剥夺
            2. 不能使用其他方式强制获取锁

              1. 循环等待
              2. 线程在等待锁的时候长时间无法获取

                ##预防死锁最佳实践

              3. 破坏必要条件
              4. 减少互斥条件或改变逻辑顺序

                1. 确定加锁顺序
                2. 避免多线程同时加锁

                  1. 绕开防止的状态
                  2. 确保线程退出前的解锁操作

                    另外,编写测试用例来验证死锁的情况,并根据结果再进行优化。同时,使用调试工具如gdb,以验证线程全面查看堆栈。通过这样的方法,可以有效减少死锁的风险。

                    通过理解死锁的原因及其解决方法,我们可以更好的在多线程环境中开发可靠的代码。好的编程习惯是为了正在跑的代码,不让它变成石膨结的状态。

    转载地址:http://ziacz.baihongyu.com/

    你可能感兴趣的文章
    @Cacheable@CacheEvict@CachePut
    查看>>
    2018信息平台专场招聘
    查看>>
    @ControllerAdvice+@ExceptionHandler全局处理Controller层异常 及其 原理
    查看>>
    @ControllerAdvice、@ExceptionHandler控制全局Controller异常
    查看>>
    @ControllerAdvice用法
    查看>>
    #VERDI# 关于Verdi使用的几个常用技巧整理
    查看>>
    @Resource注解的使用
    查看>>
    @ResponseBody 和 @RequestBody
    查看>>
    A + B 九度oj
    查看>>
    A DBA’s take on MSCA (Mobile supply chain applications)
    查看>>
    A DBA’s take on MSCA (Mobile supply chain applications)
    查看>>
    A20地址线
    查看>>
    abaqus质量缩放系数取值_ABAQUS的质量缩放
    查看>>
    Access restriction: The type FileURLConnection is not accessible due to restriction
    查看>>
    Accessibility
    查看>>
    08-信息收集之端口收集(总结版)
    查看>>
    15种下载文件的方法&文件下载方法汇总&超大文件下载
    查看>>
    anaconda、python卸载后重装以及anaconda--443
    查看>>
    AWVS工具太顶了,漏洞扫描工具AWVS介绍及安装教程
    查看>>
    CentOS 系列:CentOS 7 使用 virt-install + vnc 图形界面/非图形界面 创建虚拟机
    查看>>