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. 给锁加上超时,如果超时则放弃执行
    '''
    
    

    结果:

    
    
  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11139728.html
Copyright © 2011-2022 走看看