Python死锁和可重入死锁

来源:互联网 发布:zram内存优化如何修改 编辑:程序博客网 时间:2024/06/05 13:21
#!/usr/bin/env pythonimport threadingimport timeclass MyThread(threading.Thread):        def do1(self):                global resA,resB                if mutexA.acquire():                        msg=self.name+'got resA'                        print msg                        if mutexB.acquire(1):                                msg=self.name+'got resB'                                  print msg                                mutexB.release()                        mutexA.release()        def do2(self):                global resA,resB                if mutexB.acquire():                        msg=self.name+'got resB'                        print msg                        if mutexA.acquire(1):                                msg=self.name+'got resA'                                  print msg                                mutexA.release()                        mutexB.release()        def run(self):                self.do1()                self.do2()resA=0resB=0mutexA=threading.Lock()mutexB=threading.Lock()def test():        for i in range(5):                t=MyThread()                t.start()if __name__=='__main__':        test()

可重入死锁

import threadingimport timeclass MyThread(threading.Thread):        def run(self):                global num                time.sleep(1)                if mutex.acquire(1):                        num=num+1                        msg=self.name+'set num to'+str(num)                        print msg                        mutex.acquire()                        mutex.release()                        mutex.release()num=0mutex=threading.Lock()def test():        for i in range(5):                t=MyThread()                t.start()if __name__=='__main__':        test()
为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

import threadingimport timeclass MyThread(threading.Thread):        def run(self):                global num                time.sleep(1)                if mutex.acquire(1):                        num=num+1                        msg=self.name+'set num to'+str(num)                        print msg                        mutex.acquire()                        mutex.release()                        mutex.release()num=0mutex=threading.RLock()def test():        for i in range(5):                t=MyThread()                t.start()if __name__=='__main__':        test()



原创粉丝点击