zoukankan      html  css  js  c++  java
  • 线程之间共享全局变量数据时出现错误问题

    一、线程之间共享全局变量

      1、什么时候会出现错误?

        解答:多个线程同时操作全局变量时,可能会出现错误。

      2、造成错误的原因

        解答:这是由于CPU调度机制造成的。

      3、线程同步

        解答:

        保证同一时刻只能一个线程去操作全局变量。

        同步:协同步调,按预定的先后次序进行运行。(类似于生活中的对讲机。)

      4、通过两种线程同步的方式解决以上问题。

        线程等待(join方法),按顺序执行

        互斥锁,不按顺序执行

    二、线程之间共享全局变量演示

      

      1、要求:定义两个函数,实现循环100万次,每循环一次给全局变量加1操作。

      2、共享全局变量错误的代码

      

      

    from threading import *
    from time import *
    
    g_num = 0
    
    
    def sum_num1():
        for i in range(1000000):
            global g_num
            g_num += 1
    
        print("sum1:", g_num)
    
    
    def sum_num2():
        for i in range(1000000):
            global g_num
            g_num += 1
    
        print("sum2:", g_num)
    
    
    if __name__ == "__main__":
        t1 = Thread(target=sum_num1)
        t2 = Thread(target=sum_num2)
    
        t1.start()
       
        t2.start()

    运行结果:

      

     3、共享全局变量正确的代码,线程等待(join)

      

    from threading import *
    from time import *
    
    g_num = 0
    
    
    def sum_num1():
        for i in range(1000000):
            global g_num
            g_num += 1
    
        print("sum1:", g_num)
    
    
    def sum_num2():
        for i in range(1000000):
            global g_num
            g_num += 1
    
        print("sum2:", g_num)
    
    
    if __name__ == "__main__":
        t1 = Thread(target=sum_num1)
        t2 = Thread(target=sum_num2)
    
        t1.start()
        t1.join() # 主线程等待t1运行结束后再执行t2
        t2.start()
    View Code

    运行结果:

      

      

      

  • 相关阅读:
    dynamic 转换实体类
    泛型的简单使用
    winfrom嵌入word
    echart睡眠后台代码,
    echart实现睡眠前台代码
    Mysql时间加一天
    一道关于面向对象面试题所引发的血案(阿里)
    一道面试题让你彻底掌握JS中的EventLoop(头条)
    对象(数组)的深克隆和浅克隆(头条)
    BAT笔试题中几道关于堆栈内存和闭包作用域的题
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14304941.html
Copyright © 2011-2022 走看看