基本使用方法
from threading import Lock, RLock, Condition
lock = Lock()
lock.acquire()
lock.release()
三种有可能出现死锁的情况
1、 连续两次获取acquire
lock.acquire()
lock.acquire()
没有release锁lock
2、 互相等待的情况
A要获取资源a,b;先a后b
B要获取资源b,a;先b后a
A(a,b)
B(b,a)
A(a,b) | B(a,b) |
---|---|
acquire(a) | acquire(b) |
A获取到a后等待B释放b | B获取到b后等待A释放a |
acquire(b) | acquire(a) |
因此在互相等待时,双方都获取不到资源导致死锁
3、两个函数同时使用
from threading import Lock, RLock, Condition #可重入的锁
#在同一个线程里面,可以连续调用多次acquire, 一定要注意acquire的次数要和release的次数相等
total = 0
lock = RLock()
def add():
#1. dosomething1
#2. io操作
# 1. dosomething3
global lock
global total
for i in range(1000000):
lock.acquire()
total += 1
lock.release()
lock.release()
def desc():
global total
global lock
for i in range(1000000):
lock.acquire()
total -= 1
lock.release()
add函数和desc函数同时的调用会导致死锁。这个时候可重入锁就来了。
可重入锁RLock
在同一个线程里面,可以连续调用多次acquire, 一定要注意acquire的次数要和release的次数相等
total = 0
lock = RLock()