zoukankan      html  css  js  c++  java
  • 7 多线程 全局变量

     

    1.多线程-共享全局变量

    from threading import Thread
    import time
    
    #线程之间共享全局变量
    g_num = 100
    
    def work1():
        global g_num
        for i in range(3):
            g_num += 1
    
        print("----in work1, g_num is %d---"%g_num)
    
    
    def work2():
        global g_num
        print("----in work2, g_num is %d---"%g_num)
    
    
    print("---线程创建之前g_num is %d---"%g_num)
    
    t1 = Thread(target=work1)
    t1.start()
    
    #延时一会,保证t1线程中的事情做完
    time.sleep(1)
    
    t2 = Thread(target=work2)
    t2.start()

         

         

    • 进程之间不共享全局变量,所有出现了进程间通信

          

    2.共享全局变量的缺点

      1)两个线程同时对全局变量修改

    from threading import Thread
    import time
    
    g_num = 0
    
    def test1():
        global g_num
        for i in range(1000000):
            g_num += 1
    
        print("---test1---g_num=%d"%g_num)
    
    def test2():
        global g_num
        for i in range(1000000):
            g_num += 1
    
        print("---test2---g_num=%d"%g_num)
    
    
    p1 = Thread(target=test1)
    p1.start()
    
    # time.sleep(3) #取消屏蔽之后 再次运行程序,结果会不一样,,,为啥呢?
    
    p2 = Thread(target=test2)
    p2.start()
    
    print("---g_num=%d---"%g_num)

     

       2)等第一个线程+100000结束,才执行第二个线程

    from threading import Thread
    import time
    
    g_num = 0
    
    def test1():
        global g_num
        for i in range(1000000):
            g_num += 1
    
        print("---test1---g_num=%d"%g_num)
    
    def test2():
        global g_num
        for i in range(1000000):
            g_num += 1
    
        print("---test2---g_num=%d"%g_num)
    
    
    p1 = Thread(target=test1)
    p1.start()
    
    time.sleep(3) #取消屏蔽之后 再次运行程序,结果会不一样,,,为啥呢?
    
    p2 = Thread(target=test2)
    p2.start()
    
    print("---g_num=%d---"%g_num)

        

       

      3)列表当做参数传入

    from threading import Thread
    import time
    
    def work1(nums):
        nums.append(44)
        print("----in work1---",nums)
    
    
    def work2(nums):
        #延时一会,保证t1线程中的事情做完
        time.sleep(1)
        print("----in work2---",nums)
    
    g_nums = [11,22,33]
    
    t1 = Thread(target=work1, args=(g_nums,))
    t1.start()
    
    t2 = Thread(target=work2, args=(g_nums,))
    t2.start()

    总结:

    • 在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)
    • 缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)

        

  • 相关阅读:
    BZOJ4644 经典傻逼题 (线段树分治+可撤销线性基+Xor)
    CF678E Another Sith Tournament(思维+dp)
    HDU 6511
    HDU6513 Reverse It(容斥+Cnk)
    一篇最浅显易懂的Splay讲解(试问谁能比我的更易懂
    [CTSC2016]时空旅行 (线段树分治+凸壳
    关于dsu on tree 和一些例题 CF 741 D
    关于区间开根号+区间询问
    [FJOI2015]火星商店问题 --线段树分治+可持久化trie
    线段树 关于pushup的技巧
  • 原文地址:https://www.cnblogs.com/venicid/p/7966172.html
Copyright © 2011-2022 走看看