并发编程之死锁
死锁
死锁指的是某个资源占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态
产生死锁的情况:
对同一把互斥锁加锁的多次(对同一个)
# 对同一个互斥锁多次执行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. 给锁加上超时,如果超时则放弃执行
'''
结果: