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")
  • 相关阅读:
    并发队列、线程池、锁
    JVM、垃圾收集器
    Socket网络编程
    Netty入门
    SpringCloud微服务负载均衡与网关
    Android监听耳机按键事件
    利用本地不同磁盘文件夹作为git远程仓库进行灾备
    chrome浏览器form中button每点击一次,form就会提交一次
    [企业路由器] 一对一NAT映射设置指导
    win7镜像自带IE9的卸载
  • 原文地址:https://www.cnblogs.com/staff/p/9673802.html
Copyright © 2011-2022 走看看