线程锁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)
复制代码

 

posted on   思此狂  阅读(293)  评论(0编辑  收藏  举报

编辑推荐:
· 基于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保姆级教程

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示