首页 > 其他 > 详细

死锁与递归锁

时间:2018-05-16 00:04:44      阅读:268      评论:0      收藏:0      [点我收藏+]

死锁导致程序卡死,
互斥锁只能acquire一次,想acquire必须先release。

from threading import Thread,Lock
import time
mutexA=Lock()
mutexB=Lock()
class MyThread(Thread):
    def __init__(self):
        super().__init__()
    def run(self):
        self.f1()
        self.f2()
    def f1(self):
        mutexA.acquire()
        print("%s mutex A" % self.name)
        time.sleep(1)
        mutexB.acquire()
        print("%s mutex B" % self.name)
        mutexA.release()
        mutexB.release()
    def f2(self):
        mutexB.acquire()
        print("%s mutex B" % self.name)
        time.sleep(1)
        mutexA.acquire()
        print("%s mutex A" % self.name)
        mutexA.release()
        mutexB.release()
if __name__ == "__main__":
    for i in range(10):
        t=MyThread()
        t.start()奥

递归锁,RLock,可以连续acquire()多次。RLock内部有一个计数器,每acquire()一次计数器加1,只要计数不为0就不能被其他线程抢到。

from threading import Thread,RLock
import time
mutexB=mutexA=RLock()
技术分享图片
class MyThread(Thread):
    def __init__(self):
        super().__init__()
    def run(self):
        self.f1()
        self.f2()
    def f1(self):
        mutexA.acquire()
        print("%s mutex A" % self.name)
        time.sleep(1)
        mutexB.acquire()
        print("%s mutex B" % self.name)
        mutexA.release()
        mutexB.release()
    def f2(self):
        mutexB.acquire()
        print("%s mutex B" % self.name)
        time.sleep(1)
        mutexA.acquire()
        print("%s mutex A" % self.name)
        mutexA.release()
        mutexB.release()
if __name__ == "__main__":
    for i in range(10):
        t=MyThread()
        t.start()
View Code

 

死锁与递归锁

原文:https://www.cnblogs.com/yaya625202/p/9043220.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!