线程中的全局变量与抢占资源

    技术2022-08-01  67

    声明一个全局变量,当我们修改全局变量中的内容时,其他线程也会收到相应的修改。

    import threading import time num = 100 #global num def demo1(): global num for i in range(100): num+=1 print(f'----demo1---{num}') def demo2(): global num #num+=1 print(f'----demo2-----{num}') def main(): global num t1 = threading.Thread(target=demo1) t2 = threading.Thread(target=demo2) t1.start() t2.start() print(f'----main------{num}') if __name__ == '__main__': main()

    当range足够大时,三者的数据会出现偏差,因为修改需要耗时,而其他线程此时得到的值是之前的值不是现在的值 当一个读一个写,此时两个线程间没有任何冲突,只要时间足够长,数据是没问题的

    抢占资源验证: 当两个子线程都对一个全局变量进行修改的时候,也会因为资源抢占而导致变量的值不同: 如图: 修改num的值时也是要经历3个步骤的 获取num的值,将获取到的num+1 把第2步获取到的值保存到num 如果两个线程存在抢占资源的情况,可能1执行获取num值后还没有进行+1,这个值已经被2线程抢占或者是执行完num+1,但是并未保存到num中,此时的自增也是不成功的

    上代码:

    import threading import time num = 100 def main(): t1 = threading.Thread(target=add1,args=(1000000,)) t2 = threading.Thread(target=add2,args=(1000000,)) t1.start() #time.sleep(1) t2.start() print(f'-----main-----{num}') def add1(nums): global num for i in range(nums): num+=1 #time.sleep(1) print(f'-----add1----{num}') def add2(nums): global num for i in range(nums): num += 1 #time.sleep(1) print(f'-----add2----{num}') if __name__ == '__main__': main()

    当nums的值为100时结果: -----add1----200 -----add2----300 -----main-----300 说明add1先执行结束,该值应用到了add2中和main中

    当nums=10**5(10万)时,结果: -----add1----100100 -----main-----148375 -----add2----200100

    当nums=10**6时 -----main-----146870 -----add1----1095957 -----add2----1269474 此时的值已经乱了,main先结束,两个子线程的值互相干扰

    Processed: 0.015, SQL: 9