您的位置:首页 > 其它

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

2019-08-13 10:53 98 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44464367/article/details/97244818

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

命令:
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改的越大,差距越明显。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: