线程锁lock&rlock
首先关于锁:
1 使用锁会影响性能
2 锁可能谁导致死锁
比如:
线程A acquire a 等待b
线程B acquire b 等待a
这种资源竞争就会导致死锁
【Lock】
lock 不能连续获取两次(死锁了), 因为第二个锁会一直等待第一个释放
【Rlock】
可重入锁 Rlock 在同一个线程里面可以连续acquire多次,一定要注意acquire和releae 次数相等
其实主要就是对于你的线程处理中会有一些比较复杂的代码逻辑过程,比如很多层的函数调用,而这些函数其实都需要进行加锁保护数据访问。
这样就可能会反复的多次加锁,因而用rlock就可以进行多次加锁,解锁,直到最终锁被释放
而如果用普通的lock,当你一个函数A已经加锁,它内部调用另一个函数B,如果B内部也会对同一个锁加锁,那么这种情况就也会导致死锁。而rlock可以解决这个问题.
下面的demo中如果使用Lock,则会陷入死锁中
import threading lock = threading.RLock() info=dict() def make_name(): lock.acquire() info["name"] = "zhangsan" make_age() lock.release() def make_age(): lock.acquire() info["age"] = 20 lock.release() t = threading.Thread(target=make_name) t.start() t.join() print(info)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程