线程锁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 2021-01-02 20:56  思此狂  阅读(265)  评论(0编辑  收藏  举报

导航