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)
  • 相关阅读:
    手机端适配rem代码片段
    location记录<18.7.21>
    本地储存(localStorage)记录
    为什么size_t重要?(Why size_t matters)(转)
    Mac OS X 完全卸载MySQL
    ECMAScript6兼容性
    mac截屏
    javascript中array的map方法的使用
    Jquery对话框基本配置
    angular中封装fancyBox(图片预览)
  • 原文地址:https://www.cnblogs.com/jkklearn/p/14223906.html
Copyright © 2011-2022 走看看