线程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
在这里插入图片描述

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

线程4 多线程共享全局变量和资源竞争问题_第1张图片当执行线程1未完成一个完整步骤,就去执行线程2的时候 全局变量并没有加1,所以会少很多数值。

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

你可能感兴趣的:(线程)