19、多任务-线程-共享全局变量产生的问题资源竞争

共享全局变量会产生资源竞争
前一篇文章中的代码没产生资源竞争,因为一个写一个读。

命令:
cp 02-多线程共享全局变量2.py 03-共享全局变量产生的问题-资源竞争.py
vim 03-共享全局变量产生的问题-资源竞争.py

03-共享全局变量产生的问题-资源竞争.py

代码解读:
for i in range(num):表示下面的 g_num += 1代码执行num次,num将来传的是几就执行几次,那么就要在函数test1的参数中同时传递一个参数num,即变成了def test1(num),传递参数时是通过main函数进行传递的,但传递的一定是一个元组,要加逗号

  5 def test1(num):
  6     for i in range(num):
  7         g_num += 1
  8     print("--test1--%s" % g_num)

思路:
对test1函数的代码修改完成后,为了测试两个子线程资源竞争,对test2函数也要进行相同的代码处理
命令:
yyp复制相同的代码过去到test2,同时让main函数传递一个参数,同时把子线程的延时去掉,为了保证子线程执行完成后再执行主线程,需要在子线程完成后等待5秒钟

注意:
若要在子线程中修改全局变量,就要先声明global g_num,否则运行的时候会报错提示,变量还没定义,如果不修改而是直接用全局变量,不用加global

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("--test1--%s" % g_num)
 12 
 13 
 14 def test2(num):
 15     global g_num
 16     for i in range(num):
 17         g_num += 1
 18     print("--test2--%s" % g_num)
 19 
 20 
 21 
 22 def main():
 23 
 24     t1 = threading.Thread(target=test1,args=(100,))
 25     t2 = threading.Thread(target=test2,args=(100,))
 26 
 27     t1.start()
 28     t2.start()
 29 
 30     time.sleep(2)
 31 
 32     print("--main--%s" % g_num)
 33 if __name__ == "__main__":
 34     main()

以上代码运行后,主线程打印出来的变量是200,并没有出现资源竞争的情况。
但是如果把循环的次数num由100改成1000000,主线程最终结果应该是2000000,但实际运行起来结果并不是,因为出现了资源竞争,num改的越大,差距越明显。
19、多任务-线程-共享全局变量产生的问题资源竞争_第1张图片

资源竞争,会出现子线程重复对全局变量进行更改,而互相并不知道对方已经更改了的情况,所以最后实际一共更改的此时不是200000,去掉重复更改的次数可能会小于等于2000000

你可能感兴趣的:(多任务)