#使用类的封装来定义线程 import threading import time #代表🐟的锁 mutex_Yu=threading.Lock() #代表熊掌的锁 mutex_XiongZhang=threading.Lock() #创建一个类 类里边自定义一个方法 重写run函数 class MyThread1(threading.Thread): def run(self): mutex_Yu.acquire() #得到🐟这把锁 print("线程1已经得到鱼了") time.sleep(1) mutex_XiongZhang.acquire() #得到熊掌这把锁 print("线程1得到熊掌了") mutex_XiongZhang.release() #释放熊掌 mutex_Yu.release()#释放鱼 class MyThread2(threading.Thread): def run(self): mutex_XiongZhang.acquire() # 得到熊掌这把锁 print("线程2得到熊掌了") time.sleep(1) mutex_Yu.acquire() # 得到🐟这把锁 print("线程2已经得到鱼了") mutex_Yu.release() # 释放鱼 mutex_XiongZhang.release() # 释放熊掌 #mutex_TianTang=threading.Lock() # 一把去天堂的锁 Lock为互斥锁:只有一个人可以拿到 具有唯一性 可以使用逻辑锁来避免这种情况 mutex_TianTang=threading.RLock() #使用逻辑锁 class MyThread3(threading.Thread): def run(self): mutex_TianTang.acquire() #获得去天堂的锁钥匙 print("线程3进入了天堂") time.sleep(1) self.run() #再次调用天堂的锁 mutex_TianTang.release() #释放去天堂的锁 if __name__ == '__main__': #入口 #t1=MyThread1() #t2=MyThread2() t3=MyThread3() #t1.start() #t2.start() t3.start() 死锁的原因: 在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的。 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
进入死锁状态,命令行可以可以使用ctrl-z退出
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个线程使用。
(2) 请求与保持条件:一个线程因请求资源而阻塞时,对 已获得的资源保持不放。
(3) 不剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等 待条件:若干线程之间形成一种头尾相接的循环等待资源关系。