多线程-共享全局变量问题

本文讨论了多线程环境下共享全局变量可能导致的问题,如计算错误和线程安全问题。介绍了同步的概念,通过互斥锁确保线程安全,防止资源竞争。同时,提到了死锁现象以及生产者消费者问题,指出队列作为解决线程同步的有效工具。
摘要由CSDN通过智能技术生成

多线程-共享全局变量问题

多线程可能遇到的问题

假设有两个线程t1和t2,都要对一个变量g_num进行运算(+1),两个进程t1和t2分别对g_num各加10次,g_num的最终结果?

import threading
import time

g_num=0
def work1(num):
    global g_num
    for i in range(num):
        g_num+=1
    print("---in work1,g_num is %d"% g_num)

def work2(num):
    global g_num
    for i in range(num):
        g_num+=1
    print("---in work2,g_num is %d"% g_num)

print("---线程创建之前g_num:%d"%g_num)
t1=threading.Thread(target=work1,args=(10,))
t2=threading.Thread(target=work2,args=(10,))

t1.start()
t2.start()

while len(threading.enumerate())!=1:
    time.sleep(1)

print("2个线程对同一个变量操作之后的最终结果:%d"%g_num)

# ---线程创建之前g_num:0
# ---in work1,g_num is 10
# ---in work2,g_num is 20
# 2个线程对同一个变量操作之后的最终结果:20

一种可能的情况:

在num=0时,t1取得num=0,此时系统把t1调度为“sleeping”的状态,t2转换为“running”的状态,t2也获得num=0。然后,t2对得到的值进行加1,并赋给num,num=1.然后,系统又将t2调度为“sleeping”的状态,把t1转换为“running”的状态。线程t1又把它之前得到的0加1后赋值给num。这种情况,明明两个线程都完成了一次+1工作,但结果还是num=1。

如果我们将两个线程的参数调整为1000000,多次运行,结果不同。

说明多个线程同时对一个全局变量进行操作,会出现资源竞争问题,从而数据结果会不正确。导致线程安全问题。

同步

同步,就是协同步调。按照预定的先后次序进行运行,好比交流,一个说完,另外一个人再说。

进程和线程同步,可以理解为进程或者线程A和B一起配合。A执行一定程度时需要依赖B的某个结果,于是停下来,让B运行,B开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值