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

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

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先结束,两个子线程的值互相干扰

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值