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
代码解读:
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
相关文章推荐
- 关于进程和线程对于全局变量共享的问题学习总结
- 关于进程和线程对于全局变量共享的问题学习总结
- java笔记:熟练掌握线程技术---基础篇之解决资源共享的问题(中)--前篇
- Linux系统编程——证明线程共享全局变量
- 多线程操作全局变量的问题(有点复杂,需要考虑线程的优先级问题)
- linux线程使用读写锁共享全局变量
- 解决线程间对共享资源的竞争
- 关于线程并发访问全局变量问题
- Solution(VS)下多工程之间共享全局变量失效问题
- day 0807 多线程—共享全局变量问题
- java回忆录(3)—ThreadLocal解决线程资源共享问题
- 关于全局变量,如何被多个.c文件共享问题
- Java线程中的资源共享问题
- linux动态链接库全局变量共享问题&DLL共享数据段
- [Python]多线程编程&线程间共享变量&消费者生产者问题的解决
- 【python】多线程共享全局变量问题
- Java多线程共享全局变量问题
- java多线程全局变量共享问题
- 线程基础:多任务处理(18)——MESI协议以及带来的问题:伪共享
- python自定义线程类的使用与共享全局变量的问题