文章目录
多线程-共享全局变量问题
多线程可能遇到的问题
假设有两个线程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。
如果我们将两个线程的参数调整为1000000,多次运行,结果不同。
说明多个线程同时对一个全局变量进行操作,会出现资源竞争问题,从而数据结果会不正确。导致线程安全问题。
同步
同步,就是协同步调。按照预定的先后次序进行运行,好比交流,一个说完,另外一个人再说。
进程和线程同步,可以理解为进程或者线程A和B一起配合。A执行一定程度时需要依赖B的某个结果,于是停下来,让B运行,B开