Python 的可重入锁(RLock)的实现在threading.py文件中,部分源码摘录如下:
1. 源码注释版本
def RLock(*args, **kwargs):
"""
函数工厂返回一个可重入锁(R锁)对象
一个可重入锁必须由获取它的线程释放。一旦一个线程获取一个可重入锁,
同一个线程可以无阻塞的再次获取他。线程每次获取该锁后必须释放他。
"""
if _CRLock is None:
return _PyRLock(*args, **kwargs) #Python 语言实现的R锁
return _CRLock(*args, **kwargs) # C 语言实现R锁
class _RLock(object):
def __init__(self):
self._block = _allocate_lock() # 获取一个锁
self._owner = None # 记录Rlock对象所属的线程的pid
self._count = 0
def acquire(self, blocking=True, timeout=-1):
me = get_ident() #获取当前线程的pid
if self._owner == me: # Rlock所属的线程的pid(self._owner) 是当线程相同,Rlock的计数器+1.
self._count += 1
return 1
# 否则,锁对象的持有者不是主当前线程(或者锁没有被任何线程持有过:self._owner = None)