zoukankan      html  css  js  c++  java
  • 用户程序锁之递归锁、信号量

    递归锁:

    '''
    递归锁:
    需求:有多道门,同时只允许一个线程进门
    如果用之前的锁,进来的时候进来了,出去的时候找不到对应的锁
     下面的程序中,锁的形象表示: { run3 { run1 } { run2 } }
     说明:这里有三把锁,如果用的是普通锁,进到run1里面就出不来了。因为找不到哪一把钥匙
     所以这里要用递归锁。原理是把钥匙存成字典,每次要开门就挨把挨把的试
    '''
    import threading
    import time
    def run1():
        print("run1----")
        lock.acquire()
        global num
        num += 1
        lock.release()
        return num
    def run2():
        print("====run2")
        lock.acquire()
        global num2
        num2 += 1
        lock.release()
        return num2
    def run3():
        lock.acquire()
        res = run1()
        print("---------run3")
        res2 = run2()
        lock.release()
        print(res, res2)
    
    if __name__ == '__main__':
        num, num2 = 0, 0
    lock
    = threading.RLock() # 如果不用递归锁,会进入死循环 for i in range(10): t = threading.Thread(target=run3) t.start() while threading.active_count() != 1: print(threading.active_count()) else: print("-------all threads done-------") print(num, num2)

    信号量

    '''
    信号量:Semaphore
    锁同时只允许一个线程更改数据
    而Semaphore是同时允许一定数量的线程更改数据
    信号量与锁的区别是信号量同时有多把锁
    5个线程每完成一个就放进去一个
    '''
    import threading
    import time
    
    def run(n):
        semaphore.acquire()
        time.sleep(2)
        print("run the thread:{0}".format(n))
        semaphore.release()
    
    
    if __name__ == '__main__':
        semaphore = threading.BoundedSemaphore(5)  #最多允许5个线程同时运行
        for i in range(20):
            t = threading.Thread(target=run, args=(i,))
            t.start()
        while threading.active_count() != 1:
            pass
        else:
            print("all threads done")
  • 相关阅读:
    求一个字符串中连续出现次数最多的子串
    LintCode: Longest Common Substring
    LintCode: O(1) Check Power of 2
    LintCode: Fizz Buzz
    LintCode: 3 Sum
    LintCode: Two Sum
    LintCode: Sort Colors
    LintCode: Median of two Sorted Arrays
    LintCode: Search A 2d Matrix
    Lintcode: Sqrt(X)
  • 原文地址:https://www.cnblogs.com/staff/p/9673802.html
Copyright © 2011-2022 走看看