7.Python网络编程_多线程共享全局变量问题

   Python多线程支持全局变量的共享操作,但是它存在很多问题,先来看以下程序,该程序理论上执行完毕后全局变量g_num的值应该是2000000,但是在实际运行中,结果不足理论值

 1 import threading
 2 import time
 3 
 4 #定义一个全局变量
 5 g_num=0
 6 
 7 def test1(num):
 8     global g_num
 9     for i in range(num):
10         g_num+=1
11     print("----in test1 g_num=%d----"%g_num)
12 
13 def test2(num):
14     global g_num
15     for i in range(num):
16         g_num+=1
17     print("----in test2 g_num=%d----"%g_num)
18     
19 def main():
20     t1=threading.Thread(target=test1,args=(1000000,))
21     t2=threading.Thread(target=test2,args=(1000000,))
22     t1.start()
23     t2.start()
24     #等待上面的两个线程执行完毕....
25     time.sleep(5)
26     print("----in main Thread g_num=%d----"%g_num)
27     
28     
29 if __name__=="__main__":
30     main()
31     #理论上最后应该输出2000000(1000000+1000000)
32     #但实际上不足2000000

   该程序两个线程都具有改变全局变量的功能,主要的语句是 g_num+=1,在计算机内部真正执行的过程中,这一条语句分很多个步骤执行(就好像C++的一条语句要依靠多条汇编语句来翻译),在多线程程序执行的过程中,线程1可能刚执行完第二个步骤:把获取的值+1,就在这个瞬间计算机CPU将程序的执行权给予了线程2,就这么简单的程序执行权的交接,使得全局变量g_num真实值比理论值少了一个1,这也就是多线程程序里全局变量的主要问题。

猜你喜欢

转载自www.cnblogs.com/NiBosS/p/11963075.html
今日推荐