zoukankan      html  css  js  c++  java
  • 互斥锁和死锁

    #!/usr/bin/env python
    # encoding: utf-8  
    # Date: 2018/6/18

    # # 死锁
    # from threading import Thread,Lock
    # import time
    # mutexA = Lock()
    # mutexB = Lock()
    #
    #
    # class MyThread(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(0.1)
    #
    #         mutexA.acquire()
    #         print('%s 拿到了A锁' % self.name)
    #         mutexA.release()
    #
    #         mutexB.release()
    #
    #
    # if __name__ == '__main__':
    #     for i in range(10):
    #         t = MyThread()
    #         t.start()

    # 互斥锁只能acquire一次
    # from threading import Thread,Lock
    #
    # mutexA = Lock()
    #
    # mutexA.acquire()
    # mutexA.release()

    # 递归锁:可以连续acquire多次,每一次acuqire一次计数器加1,只有计数为0时,才能被抢到
    from threading import Thread,RLock
    import time

    mutexB = mutexA = RLock()


    class MyThread(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(0.1)

            mutexA.acquire()
            print('%s 拿到了A锁' % self.name)
            mutexA.release()

            mutexB.release()


    if __name__ == '__main__':
        for i in range(10):
            t = MyThread()
            t.start()

  • 相关阅读:
    55_Go基础_1_22 map 基本用法
    59_Go基础_1_26 字符串
    56_Go基础_1_23 map的遍历与排序
    52_Go基础_1_19 切片的再扩容
    数据类型和Json格式
    MySQL 存储过程的三个例子
    struts整合spring
    Android动态操作RelativeLayout里面的Button
    windows环境变量的初步研究
    struts2源码分析StrutsPrepareAndExecuteFilter
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9196683.html
Copyright © 2011-2022 走看看