声明一个全局变量,当我们修改全局变量中的内容时,其他线程也会收到相应的修改。
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先结束,两个子线程的值互相干扰