死锁:前提是有多个锁
所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源时,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。
产生死锁的代码:
import threadingimport timedef test1():mA.acquire()print("test1--上锁A")time.sleep(1)mB.acquire()print("test1---上锁B")mA.release()print("test1---解锁A")mB.release()print("test1---解锁B")def test2():mB.acquire()print("test2---上锁B")time.sleep(1)mA.acquire()print("test2--上锁A")mB.release()print("test2---解锁B")mA.release()print("test2---解锁A")mA = threading.Lock()mB = threading.Lock()def main():t1 = threading.Thread(target=test1)t2 = threading.Thread(target=test2)t1.start()t2.start()if __name__ == '__main__':main()
运行结果:
解决死锁问题
添加超时时间银行家算法添加超时时间
import threadingimport timedef test1():mA.acquire()print("test1--上锁A")time.sleep(1)mB.acquire(timeout=3) # 在此处添加了超时时间,此处上锁超过3秒自动解锁print("test1---上锁B")mA.release()print("test1---解锁A")# mB.release() 因为是死锁,所有在上面代码一定会达到超时时间自动解锁,执行到此处时会报错(release unlocked lock)无法解锁已经解开的锁,要注释掉print("test1---解锁B")def test2():mB.acquire()print("test2---上锁B")time.sleep(1)mA.acquire()print("test2--上锁A")mB.release()print("test2---解锁B")mA.release()print("test2---解锁A")
运行结果:
test1--上锁Atest2---上锁Btest1---上锁Btest1---解锁Atest1---解锁Btest2--上锁Atest2---解锁Btest2---解锁A