目录
死锁:两个或两个以上的进程或线程,在执行过程中,因抢夺资源而造成的相互无解等待的现象。
死锁:两个或两个以上的进程或线程,在执行过程中,因抢夺资源而造成的相互无解等待的现象。
死锁进程:产生了死锁现象的进程。
例如:
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()