互斥锁

发布时间:2019-05-11 22:36:34编辑:auto阅读(1833)

    作用:

      解决资源竞争问题

    死锁:

      当一组线/进程中的每个线/进程都在等待某个事件发生,而只有这组线/进程中的其他进程才能触发该事件,这就称这组线/进程发生了死锁。

      创建的锁过多,可能会造成死锁问题。

      可以在设计程序时从逻辑上避免死锁出现,延时、银行家算法等

     

    # 以下代码如未使用互斥锁,最终计算出来的的数值会出错(比实际数小)

    # 上锁的代码越少越好,只在关键位置加锁
    import threading
    import time
    
    
    # 定义一个全局变量
    g_num = 0
    
    # 创建一个互斥锁,默认没有上锁
    mutex = threading.Lock()
    
    
    def func1(num):
        global g_num
        # 如上锁之前没有上锁,此时上锁成功
        # 如上锁之前已被上锁,此时会堵塞在这里,直到锁被解开
        for i in range(num):
            # 上锁
            mutex.acquire()
            g_num += 1
            # 解锁
            mutex.release()
        print("in func1 g_num=%d" % g_num)
    
    
    def func2(num):
        global g_num
        for i in range(num):
            # 上锁
            mutex.acquire()
            g_num += 1
            # 解锁
            mutex.release()
        print("in func2 g_num=%d" % g_num)
    
    
    def main():
        # target指定将来这个线程去哪个函数执行代码
        # args指定将来调用函数的时候,传递什么数据过去
        t1 = threading.Thread(target=func1, args=(1000000,))
        t2 = threading.Thread(target=func2, args=(1000000,))
    
        t1.start()
        t2.start()
    
        # 等待上面2个线程执行完毕..
        time.sleep(5)
    
        print("in main Thread g_num=%d" % g_num)
    
    
    if __name__ == "__main__":
        main()

     

关键字