文章目录
多线程—共享全局变量问题
多线程可能遇到的问题
假设有两个线程t1和t2,都要对一个变量g_num进行运算(+1),两个线程t1和t2分别对g_num各加10次,g_num的最终结果?
import threading
import time
g_num=0
def work1(num):
global g_num
for i in range(num):
g_num+=1
print('---in work1,g_num is %d---'%g_num)
def work2(num):
global g_num
for i in range(num):
g_num+=1
print('---in work2,g_num is %d---'%g_num)
print('---线程创建之前g_num:%d'%g_num)
t1=threading.Thread(target=work1,args=(10,))
t2=threading.Thread(target=work2,args=(10,))
t1.start()
t2.start()
while len(threading.enumerate())!=1:
time.sleep(1)
print('2个线程操作之后的最终结果:%d'%g_num)
---线程创建之前g_num:0
---in work1,g_num is 10---
---in work2,g_num is 20---
2个线程操作之后的最终结果:20
一种可能的情况:
在num=0时,t1取得num=0,此时系统把t1调度为"sleeping"的状态,t2转换为"running"的状态,t2也获得num=0。然后,t2对得到的值进行加1 并赋给num,num=1。然后,系统又将t2调度为"sleeping"的状态,把t1转换为"running"。线程t1又把它之前得到的0加1后赋值给num。这种情况,明明两个线程都完成了一次+1工作,但结果还是num=1
如果我们将两个线程的参数调整为1 000 000,多次运行,结果不同。
说明多个线程同时对一个全局变量进行操作,会出现资源竞争问题,从而数据结果会不正确。导致线程安全问题
同步
同步,就是协调步调,按照预定的先后次序进行