python3 - 死锁 and 递归锁

目录

死锁:两个或两个以上的进程或线程,在执行过程中,因抢夺资源而造成的相互无解等待的现象。

递归锁:在python中支持在同一线程中多次请求同一资源。

 - Rlock模块:递归锁的实现模块,用来防止死锁问题出现


死锁:两个或两个以上的进程或线程,在执行过程中,因抢夺资源而造成的相互无解等待的现象。

死锁进程:产生了死锁现象的进程。

例如:

from threading import Thread,Lock,RLock
import time

mutexA=Lock()
mutexB=Lock()


class Mythead(Thread):
    def run(self):
        self.f1()
        self.f2()

    def f1(self):
        mutexA.acquire()
        print('%s 抢到A锁' %self.name)
        mutexB.acquire()
        print('%s 抢到B锁' %self.name)
        mutexB.release()
        mutexA.release()

    def f2(self):
        mutexB.acquire()
        print('%s 抢到了B锁' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('%s 抢到了A锁' %self.name)
        mutexA.release()
        mutexB.release()

if __name__ == '__main__':
    for i in range(100):
        t=Mythead()
        t.start()

打个比方:A.B两个房间,a,b两个人。a被锁在B房间拿着A房钥匙,A被锁在b房间拿着B房钥匙。


递归锁:在python中支持在同一线程中多次请求同一资源。

 - Rlock模块:递归锁的实现模块,用来防止死锁问题出现

原理:内部存在一个Lock本地锁,一个Counter变量记录acquire的次数。每一次资源的acquire引用会增加counter数值,每一次资源的release释放会减少counter数值。直到一个线程内的counter的值变为0,即所有acquire都被release了,其他线程才能获得资源。

from threading import Thread,Lock,RLock
import time

# mutexA=Lock()
# mutexB=Lock()
mutexB=mutexA=RLock()


class Mythead(Thread):
    def run(self):
        self.f1()
        self.f2()

    def f1(self):
        mutexA.acquire()
        print('%s 抢到A锁' %self.name)
        mutexB.acquire()
        print('%s 抢到B锁' %self.name)
        mutexB.release()
        mutexA.release()

    def f2(self):
        mutexB.acquire()
        print('%s 抢到了B锁' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('%s 抢到了A锁' %self.name)
        mutexA.release()
        mutexB.release()

if __name__ == '__main__':
    for i in range(100):
        t=Mythead()
        t.start()

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/82499723