线程之间共享全局变量的问题
import time
import random
import threading
g_num = 100
def work1():
global g_num #全局变量在函数中使用需要申明
for i in range(3):
g_num+=1
time.sleep(random.random())
print(f"in work1_g_num = {g_num}")
def work2():
global g_num
for i in range(3):
g_num+=1
time.sleep(random.random())
print(f"in work2_g_num = {g_num}")
def main():
t1 = threading.Thread(target=work1)
t2 = threading.Thread(target=work2)
t1.start()
t2.start()
if __name__ == '__main__':
main()
结果为: 可以看到在t1函数中利用子线程修改了值,在t2中和主函数中也会改变
in work1_g_num=102
in work1_g_num=103
in work2_g_num = 104
in work1_g_num=105
in work2_g_num = 105
in work2_g_num = 106
有可能遇到的问题
假设两个线程t1,t2都要对群居变量g_num(默认0)进行+1运算,t1,t2都各自对g_num加10次,g_num的最终值应该是20
但是由于多线程的操作,有可能会出现别的情况
在g_num=0时,t1取得g_num=0。此时系统把t1设置为"sleeping"状态,把t2设置为"running"状态,t2也获取g_num=0.
然后t2对取得的值进行加一并且赋值给g_num,使得g_num=1
此时,系统又把t2设为"sleeping"状态,把t1转为“running”状态,线程t1又把它之前得到的0加一后赋值给g_num。
这样导致虽然t1,t2都进行了加一,但是结果仍然是g_num=1
如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确