线程4 多线程共享全局变量和资源竞争问题

多线程共享全局变量
资源竞争

多线程共享全局变量

  • 例子代码(通过多个函数改变一个全局变量验证)

查看全局变量g_num的值受到的多个线程中的影响

import threading
import time

    # 多个线程之间共享全局变量
    # 用global

# 定义一个全局变量
g_num = 100

def Text1():	//函数作用:让g_num加1
    global g_num
    g_num += 1
    print("---Text1_g_num=%d" % g_num)
def Text2():	//函数作用:查看text1执行后的g_num值是否是改变后的值
    print("---Text2_g_num=%d" % g_num)
def main():
    t1 = threading.Thread(target= Text1)
    t2 = threading.Thread(target= Text2)
    t1.start()
    time.sleep(1)
    t2.start()

if __name__ == '__main__':
    main()

在这里插入图片描述

  • 结论:一个线程改变的值,在另外一个线程中能够有效,多线程共享全局变量。

  • 例子代码(通过传全局变量给函数)

Thread传入参数的形式

t1 = threading.Thread(target=Text1, args=(g_num,))

import time
import threading
    // 列表当做实参传入到线程当中
    // args参数传入的是元组
    // 形式:t1 = threading.Thread(target=Text1, args=(g_num,))

# 定义一个全局变量
g_num =[11,22,33]

def Text1(nums):
    nums.append(44)
    print("In Text1----",nums)


def Text2(nums):
    time.sleep(1)
    print("In Text2----",nums)


def main():
    t1 = threading.Thread(target= Text1,args=(g_num,))
    t2 = threading.Thread(target= Text2,args=(g_num,))
    t1.start()
    t2.start()

if __name__ == '__main__':
    main()

在这里插入图片描述多线程共享全局变量


资源竞争

  • 例子代码(两个线程同时操作1个全局变量)
import threading
import time
    # global告诉python这是g_num一个全局变量
g_num = 0
def Text1(nums):
    global g_num
    for i in range(nums):
        g_num += 1
    print("In Text1----",g_num)


def Text2(nums):
    global g_num
    for i in range(nums):
        g_num += 1
    print("In Text2----",g_num)


def main():
    # 分别传入100 和 1000000
    t1 = threading.Thread(target= Text1,args=(1000000,))	//这个地方改值 可以是100,可以是1000000.
    t2 = threading.Thread(target= Text2,args=(1000000,))	
    t1.start()
    t2.start()
   

if __name__ == '__main__':
    main()

当两个线程都对1个全局变量加1000000
在这里插入图片描述当两个线程都对1个全局变量加100
在这里插入图片描述

  • 可以发现多线程共享全局变量的问题:资源竞争。产生因由:时间片轮转

在这里插入图片描述当执行线程1未完成一个完整步骤,就去执行线程2的时候 全局变量并没有加1,所以会少很多数值。

解决方法:要么一个线程操作全局变量执行完,要么不做。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值