死锁 Lock互斥锁 RLock逻辑锁

发布于:2023-01-15 ⋅ 阅读:(217) ⋅ 点赞:(0)
#使用类的封装来定义线程

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) 循环等 待条件:若干线程之间形成一种头尾相接的循环等待资源关系。