python多线程共享全局变量的问题

线程之间共享全局变量的问题

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

如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确

发布了21 篇原创文章 · 获赞 21 · 访问量 1527

猜你喜欢

转载自blog.csdn.net/Assassin567/article/details/104267617