zoukankan      html  css  js  c++  java
  • 并发编程之死锁

    死锁

    死锁指的是某个资源占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态

    产生死锁的情况:

    对同一把互斥锁加锁的多次(对同一个)

    # 对同一个互斥锁多次执行acquire 可能导致死锁,情况如下:
    from threading import Lock
    l = Lock()
    
    l.acquire()
    # 第一个任务
    print("task run")
    print("over")
    # l.release()         # 当这个步骤忘记写了之后,l这把锁,就会出现死锁的情况
    
    l.acquire()
    # 第二个任务
    print("task1 run")
    print("over1")
    l.release()
    

    死锁的另外一种情况:

    from threading import Lock,Thread
    import time
    lock_one = Lock()
    lock_two = Lock()
    
    def eat1():
        lock_one.acquire()      # 筷子
        time.sleep(0.1)
        lock_two.acquire()      # 碗
    
        print("开吃了 1")
    
        lock_one.release()
        lock_two.release()
    
    
    def eat2():
    
        lock_two.acquire()      # 碗
        time.sleep(0.1)
        lock_one.acquire()      # 筷子
    
        print("开吃了 2")
    
        lock_two.release()
        lock_one.release()
    
    
    t_one = Thread(target=eat1)
    t_one.start()
    t_two = Thread(target=eat2)
    t_two.start()
    '''
    产生死锁的情况:
    1. 对同一把互斥锁加锁了多次
    2. 有多把锁,被不同线程或进程所持有,就会导致相互等待对方释放,程序就会卡死
    
    对于第二种情况的解决方案:
    1. 抢锁一定按照顺序抢
    2. 给锁加上超时,如果超时则放弃执行
    '''
    
    

    结果:

    
    
  • 相关阅读:
    Redis数据结构之字典
    多路复用
    Redis数据结构之SDS
    记一个图片转换神器vectorizer
    Java基础之面向对象上
    科学
    Linux内核源码分析之setup_arch (二)
    Linux内核源码分析之setup_arch (一)
    printk 流程分析
    多个线程顺序打印问题,一网打尽
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11139728.html
Copyright © 2011-2022 走看看