zoukankan      html  css  js  c++  java
  • 死锁现象与递归锁解法

    死锁:此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。

    递归锁:可以多次acquire加锁

        使用:from threading import RLock     mutexA=RLock()

    from threading import Thread,Lock
    import time
    
    mutexA=Lock()
    mutexB=Lock()
    
    
    
    class Mythead(Thread):
        def run(self):
            self.f1()
            self.f2()
    
        def f1(self):
            mutexA.acquire()
            print('%s 抢到A锁' %self.name)
            mutexB.acquire()
            print('%s 抢到B锁' %self.name)
            mutexB.release()
            mutexA.release()
    
        def f2(self):
            mutexB.acquire()
            print('%s 抢到了B锁' %self.name)
            time.sleep(2)
            mutexA.acquire()
            print('%s 抢到了A锁' %self.name)
            mutexA.release()
            mutexB.release()
    
    if __name__ == '__main__':
        for i in range(100):
            t=Mythead()
            t.start()
    
    结果:
    Thread-1 抢到A锁
    Thread-1 抢到B锁
    Thread-1 抢到了B锁
    Thread-2 抢到A锁
    后面就卡住了
    举例
    from threading import Thread,Lock,RLock
    import time
    
    mutexB=mutexA=RLock()
    
    
    class Mythead(Thread):
        def run(self):
            self.f1()
            self.f2()
    
        def f1(self):
            mutexA.acquire()
            print('%s 抢到A锁' %self.name)
            mutexB.acquire()
            print('%s 抢到B锁' %self.name)
            mutexB.release()
            mutexA.release()
    
        def f2(self):
            mutexB.acquire()
            print('%s 抢到了B锁' %self.name)
            time.sleep(2)
            mutexA.acquire()
            print('%s 抢到了A锁' %self.name)
            mutexA.release()
            mutexB.release()
    
    if __name__ == '__main__':
        for i in range(5):
            t=Mythead()
            t.start()
    
    结果:
    Thread-1 抢到A锁
    Thread-1 抢到B锁
    Thread-1 抢到了B锁
    Thread-1 抢到了A锁
    Thread-2 抢到A锁
    Thread-2 抢到B锁
    Thread-3 抢到A锁
    Thread-3 抢到B锁
    Thread-3 抢到了B锁
    Thread-3 抢到了A锁
    Thread-5 抢到A锁
    Thread-5 抢到B锁
    Thread-2 抢到了B锁
    Thread-2 抢到了A锁
    Thread-4 抢到A锁
    Thread-4 抢到B锁
    Thread-4 抢到了B锁
    Thread-4 抢到了A锁
    Thread-5 抢到了B锁
    Thread-5 抢到了A锁
    递归锁解法
  • 相关阅读:
    开发一个基于 Android系统车载智能APP
    Xilium.CefGlue利用XHR实现Js调用c#方法
    WPF杂难解 奇怪的DisconnectedItem
    (转)获取安卓iOS上的微信聊天记录、通过Metasploit控制安卓
    mac 安装npm
    mac安装Homebrew
    关于面试,我也有说的
    【分享】小工具大智慧之Sql执行工具
    领域模型中分散的事务如何集中统一处理(C#解决方案)
    小程序大智慧,sqlserver 注释提取工具
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/11212142.html
Copyright © 2011-2022 走看看