并发编程之死锁

死锁

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

产生死锁的情况:

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

# 对同一个互斥锁多次执行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. 给锁加上超时,如果超时则放弃执行
'''

结果:


原文地址:https://www.cnblogs.com/plf-Jack/p/11139728.html