zoukankan      html  css  js  c++  java
  • 线程锁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)
  • 相关阅读:
    linux故障分析简介
    egon说一切皆对象--------面向对象进阶紫禁之巅
    alex说:一切皆bytes
    数据类型小结
    继续死磕python
    python初步学习
    初识python
    3.17内存,进程,rpm和yum,python编译安装
    用户权限(3.15)
    操作系统和基础网络知识
  • 原文地址:https://www.cnblogs.com/jkklearn/p/14223906.html
Copyright © 2011-2022 走看看