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

    作用:

      解决资源竞争问题

    死锁:

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

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

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

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

    # 上锁的代码越少越好,只在关键位置加锁
    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()
  • 相关阅读:
    影响一个UIView是否能正常显示的几个因素
    浅谈多进程多线程的选择
    Spring阅读方法
    数据库范式通俗解释
    MySQL学习笔记(二):MySQL数据类型汇总及选择参考
    MySQL学习笔记(一):SQL基础
    存储过程优缺点
    MySQL学习笔记(三):常用函数
    bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
    bzoj 3166 [Heoi2013]Alo 可持久化Trie
  • 原文地址:https://www.cnblogs.com/Selling-fish-bears/p/10369195.html
Copyright © 2011-2022 走看看