python封装dll能不能突破线程锁_线程锁的一个大坑

原来的一位同事@炮哥, 昨天在QQ问我: “想请教下一个线程获得lock之后,也可能被其他的线程释放掉?这个是因为线程之间的资源是共享的吗?这样的话普通的thread lock 都是不安全的了?”. 我第一反应就是怎么可能:’谁加锁谁解锁呗,别的线程怎么能解锁?’

炮哥发来一段python官网的文档说明:

A factory function that returns a new primitive lock object. Once a thread has acquired it, subsequent attempts to acquire it block, until it is released; any thread may release it.

最有最后一句前是分号. 简单地说,一个线程获取锁, 以后的尝试获取都会被阻塞,除非它会释放. 但是 同时 其他其他线程可以释放

好,写个例子验证下:

import threading

import time

lock = threading.Lock()

def lock_holder(lock):

print('Starting')

while True:

lock.acquire()

print('Holding')

time.sleep(100)

print('Sleep done')

def lock_release(lock):

time.sleep(1) # 保证顺序

lock.release()

print('Release it')

holder = threading.Thread(target=lock_holder, args=(lock,), name='LockHolder')

holder.setDaemon(True)

holder.start()

#lock_release(lock)

release = threading.Thread(target=lock_release, args=(lock,), name='release')

release.start()

holder = threading.Thread(target=lock_holder, args=(lock,), name='LockHolder')

holder.setDaemon(True)

holder.start()

奇迹发生了…. 线程b果然可以释放线程a的锁,颠覆人生观啊.

PS: 但是Rlock不会被其他线程释放,因为它记录该线程的所有者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值