概念
死锁:某一线程的锁没有及时释放导致的程序无法继续运行下去。是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
案例
importthreadingimporttime# 创建互斥锁lock=threading.Lock() # 根据下标去取值, 保证同一时刻只能有一个线程去取值defget_value(index): # 上锁lock.acquire() print(threading.current_thread()) my_list= [3,6,8,1] # 判断下标释放越界ifindex>=len(my_list): print("下标越界:", index) returnvalue=my_list[index] print(value) time.sleep(0.2) # 释放锁lock.release() if__name__=='__main__': # 模拟大量线程去执行取值操作foriinrange(30): sub_thread=threading.Thread(target=get_value, args=(i,)) sub_thread.start()
运行结果
分析
上面的程序中在get_value函数中,因为下标越界直接结束了这个函数,并没有执行下面的lock.release()命令,锁一直处于锁住的状态,其他线程无法执行,程序一直在等待运行中。
解决方法:
在合适的地方释放锁
importthreadingimporttime# 创建互斥锁lock=threading.Lock() # 根据下标去取值, 保证同一时刻只能有一个线程去取值defget_value(index): # 上锁lock.acquire() print(threading.current_thread()) my_list= [3,6,8,1] ifindex>=len(my_list): print("下标越界:", index) # 当下标越界需要释放锁,让后面的线程还可以取值lock.release() returnvalue=my_list[index] print(value) time.sleep(0.2) # 释放锁lock.release() if__name__=='__main__': # 模拟大量线程去执行取值操作foriinrange(30): sub_thread=threading.Thread(target=get_value, args=(i,)) sub_thread.start()