死锁
(1)介绍
- 死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的一种现象。
- 即两个或多个进程持有各自的锁并试图获取对方持有的锁,从而导致被阻塞,不能向前执行,最终形成僵局。
- 在这种情况下,系统资源利用率极低,系统处于一种死循环状态。
| from threading import Thread, Lock |
| import time |
| |
| metexA = Lock() |
| metexB = Lock() |
| |
| |
| |
| |
| |
| class MyThread(Thread): |
| def run(self): |
| self.func1() |
| self.func2() |
| |
| def func1(self): |
| metexA.acquire() |
| |
| print(f'{self.name} 抢到了A锁') |
| metexB.acquire() |
| print(f'{self.name} 抢到了B锁') |
| metexB.release() |
| metexA.release() |
| |
| def func2(self): |
| metexB.acquire() |
| |
| print(f'{self.name} 抢到了A锁') |
| time.sleep(2) |
| metexA.acquire() |
| print(f'{self.name} 抢到了B锁') |
| metexA.release() |
| metexB.release() |
| |
| |
| def main(): |
| for i in range(10): |
| t = MyThread() |
| t.start() |
| |
| |
| if __name__ == '__main__': |
| main() |
| |
| |
| |
| |
| |
| |
| |
递归锁
(1)介绍
- 递归锁(也叫可重入锁)是一种特殊的锁,它允许一个线程多次请求同一个锁,称为“递归地”请求锁
- 在该线程释放锁之前,会对锁计数器进行累加操作,线程每成功获得一次锁时,都要进行相应的解锁操作,直到锁计数器清零才能完全释放该锁。
- 递归锁能够保证同一线程在持有锁时能够再次获取该锁,而不被自己所持有的锁所阻塞,从而避免死锁的发生。
- 但是注意要正常使用递归锁,避免过多地获取锁导致性能下降。
(2)示例
- 可以被连续的 acquire 和 release
- 但是只能被第一个抢到这把锁上执行上述操作
- 他的内部有一个计数器,每acquire一次计数 +1 每release一次 计数-1
- 只要计数不为0,那么其他人都无法抢到该锁
| from threading import Thread, Lock, RLock |
| import time |
| |
| |
| metexA = metexB = RLock() |
| |
| |
| |
| |
| |
| class MyThread(Thread): |
| def run(self): |
| self.func1() |
| self.func2() |
| |
| def func1(self): |
| metexA.acquire() |
| |
| print(f'{self.name} 抢到了A锁') |
| metexB.acquire() |
| print(f'{self.name} 抢到了B锁') |
| metexB.release() |
| metexA.release() |
| |
| def func2(self): |
| metexB.acquire() |
| |
| print(f'{self.name} 抢到了A锁') |
| time.sleep(2) |
| metexA.acquire() |
| print(f'{self.name} 抢到了B锁') |
| metexA.release() |
| metexB.release() |
| |
| |
| def main(): |
| for i in range(10): |
| t = MyThread() |
| t.start() |
| |
| |
| if __name__ == '__main__': |
| main() |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通