• 并发编程(三) 线程互斥


    线程互斥

    该实例创建了3个线程t1、t2和t3同步执行,三个线程都访问全局变量data,并改变它的值。当第一个线程t1请求锁成功后,开始访问共享数据data,第二个线程t2和t3也开始请求锁,但是此时t1还没有释放锁,所以t2、t3处于等待状态,直到t1调用lock.release()释放锁,t3才能得到锁。这样就保证了这三个线程共享数据data的一致性和同步性。并且这三个线程是并发执行的,没有人为控制其获得锁的顺序,所以他们执行的顺序也是不定的。

    注意:
    调用acquire([timeout])时,线程将一直阻塞,直到获得锁或者直到timeout秒后返回是否获得锁。

    import time
    import threading
    
    data=0
    lock=threading.Lock() #创建一个锁对象
    
    def func():
        global data
        print("%s acquire lock...\n" %threading.currentThread().getName())
        if lock.acquire():
            print("%s get lock...\n" %threading.currentThread().getName())
            data += 1 #must lock
            time.sleep(2) #其他操作
            print("%s release lock...\n" %threading.currentThread().getName())
    
        #调用release()将释放锁
        lock.release()
    
    startTime=time.time()
    t1=threading.Thread(target=func)
    t2=threading.Thread(target=func)
    t3=threading.Thread(target=func)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    
    endTime=time.time()
    print("used time is",endTime-startTime)
  • 相关阅读:
    互斥锁的通俗理解
    U-Boot下分区信息查看
    《计算机组成原理》唐朔飞第二版_笔记
    《大话程序员》安晓辉_笔记
    C++ 类对象的初始化顺序
    FilterTerminal使用说明全总结
    sed -i 命令常用方法总结
    入园记录
    cookies,sessionStorage 和 localStorage区别
    优雅降级和渐进增强的理解:
  • 原文地址:https://www.cnblogs.com/kknote/p/16103454.html
Copyright © 2020-2023  润新知