死锁
一、什么是死锁
1、一直等待对方释放锁的情况就是死锁。
2、类似于男女之间吵架的情况,双方一直等待对方道歉的情况。
二、死锁的使用
1、要求:多线程同时根据下标在列表中取值,要保证同一时刻只能有一个线程去取值。
2、列锁示例:
from threading import * g_num = 0 # 创建锁 mutex = Lock() def get_value(index): # 上锁 mutex.acquire() my_list = [10,20,30] # 判断上标是否越界 if index >= len(my_list): print("下标越界:", index) return value = my_list[index] # 根据下标取值 print(value) # 释放锁 mutex.release() if __name__ == '__main__': for i in range(10): # 循环创建10个线程 t = Thread(target=get_value,args=(i,)) t.start()
运行结果:
造成死锁的原因:
当其中一个线程执行到第一次下标越界后,通过return就结束了,但是它之前创建的锁并未被释放,后面的线程都在等待锁释放,所以出现了死锁的情况。
解决死锁的方法:
在【下标越界】的情况下也要加上释放锁的代码
from threading import * g_num = 0 # 创建锁 mutex = Lock() def get_value(index): # 上锁 mutex.acquire() my_list = [10,20,30] # 判断上标是否越界 if index >= len(my_list): print("下标越界:", index) mutex.release() # 在下标越界的代码处释放锁 return value = my_list[index] # 根据下标取值 print(value) # 释放锁 mutex.release() if __name__ == '__main__': for i in range(10): # 循环创建10个线程 t = Thread(target=get_value,args=(i,)) t.start()
运行结果: