zoukankan      html  css  js  c++  java
  • 【Rollo的Python之路】Python 线程deadlock与recursivelock

    死锁:

    所谓死锁,就是指俩个或俩个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法说推进下去

    import threading,time
    
    class myThread(threading.Thread):
        def doA(self):
            lockA.acquire()
            print(self.name,"getlockA",time.ctime())
            time.sleep(3)
            lockB.acquire()
            print(self.name,'getlockB',time.ctime())
            lockB.release()
            lockA.release()
    
        def doB(self):
            lockB.acquire()
            print(self.name,"getlockB",time.ctime())
            time.sleep(3)
            lockA.acquire()
            print(self.name,'getlockA',time.ctime())
            lockA.release()
            lockB.release()
        def run(self):
            self.doA()
            self.doB()
    
    if __name__ == "__main__":
    
        lockA = threading.Lock()
        lockB = threading.Lock()
        threads = []
        for i in range(5):
            threads.append(myThread())
        for t in threads:
            t.start()
        for t in threads:
            t.join()
    
    
    ===============================
    
    Thread-1 getlockA Fri May 24 23:30:18 2019
    Thread-1 getlockB Fri May 24 23:30:21 2019
    Thread-2 getlockA Fri May 24 23:30:21 2019
    Thread-1 getlockB Fri May 24 23:30:21 2019

    注意:Thread-1 开始执行的时候,执行完doA的时候,释放了lockA与lockB. 同Thread-1开始执行doB的时候,因为这个时间是没有同步锁的,所以Thread-2也可以执行doA了。这时Thread-1拿 到了lockB,同时

    Thread-2 拿到lockA.当Thread-1走到doB的第二步,他要想拿lockA,但是lockA在Thread-2身上,没有释放,Thread-1拿不到lockA,只有等待。。。。Thread-2走doA的第二步时,他要拿lockB.但是lockB

    在Thread-1身上,没有释放,Thread-2拿不到lockB,也只有等待。 这样在没有外力的情况下,这个程序就等死了。。。。。

    这就是死锁产生的原因。


    threading.RLock是递归锁
    递归锁就是调用threading下的RLock类功能实现的,RLock它自带有计数功能,每让线程获取到以后就会就进行自加一的功能(RLock默认数值是0,只要RLock不是0线程就不能进行获取),
    只要进行一进行释放功能RLock就会进行自减一的功能直到为0时。

    import threading,time
    
    class myThread(threading.Thread):
        def doA(self):
            lock.acquire()
            print(self.name,"getlockA",time.ctime())
            time.sleep(3)
            lock.acquire()
            print(self.name,'getlockB',time.ctime())
            lock.release()
            lock.release()
    
        def doB(self):
            lock.acquire()
            print(self.name,"getlockB",time.ctime())
            time.sleep(3)
            lock.acquire()
            print(self.name,'getlockA',time.ctime())
            lock.release()
            lock.release()
        def run(self):
            self.doA()
            self.doB()
    
    if __name__ == "__main__":
    
        # lockA = threading.Lock()
        # lockB = threading.Lock()
        lock = threading.RLock()  #threading.RLock是递归锁,根据时间来的,就可以解决死锁问题
    
    
    
        threads = []
        for i in range(5):
            threads.append(myThread())
        for t in threads:
            t.start()
        for t in threads:
            t.join()
     
  • 相关阅读:
    假设用一个名为text的字符串向量存放文本文件的数据,其中的元素或者是一句话或者是一个用于表示段分隔的空字符串。将text中第一段全改为大写形式
    迭代器介绍
    从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写字母。
    标准库类型vector
    css 滤镜之AlphaImageLoader
    css设置背景图片自适应
    网易云音乐怎么免费下载付费歌曲
    font-family,font-size,color
    css设置图片居中、居左、居右
    数据库语句之建表、拷贝数据表
  • 原文地址:https://www.cnblogs.com/rollost/p/10920802.html
Copyright © 2011-2022 走看看