本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
递归锁(可重入锁)
可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。
代码实现
from threading import Thread, Lock, RLock
import time
mutexA = mutexB = RLock()
class 对付工贼(Thread):# 类只要加括号多次 产生的肯定是不同的对象 如果你想要实现多次加括号等到的是相同的对象那么就要参考单例模式
def run(self):
self.工人A()
self.工人B()
def 工人A(self):
mutexA.acquire()#上锁
print('%s 抢到A狼牙棒'% self.name) # 获取当前线程名
mutexB.acquire()
print('%s 抢到B狼牙棒'% self.name)
mutexB.release()#释放锁
mutexA.release()
def 工人B(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(10):
t = 对付工贼()
t.start()
效果