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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值