zoukankan      html  css  js  c++  java
  • 死锁与递归锁

    死锁导致程序卡死,
    互斥锁只能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
  • 相关阅读:
    闭包
    laravel 控制器
    laravel 模板
    laravel 视图
    laravel 请求
    laravel 分页
    解决启动Apache遇到的问题Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:8888
    一张号称一篇程序覆盖Python基础的代码
    [转载]激活Navicat Premium
    C语言自定义函数的形参为数组时需要注意传入长度
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9043220.html
Copyright © 2011-2022 走看看