Python—多线程_共享全局变量问题

本文讨论了Python多线程中遇到的共享全局变量问题,解释了由于并发操作导致的数据不正确。提出了通过同步机制,如互斥锁来解决计算错误。介绍了死锁的概念,并探讨了生产者消费者问题及其解决方案,推荐使用Python的queue模块实现线程安全的队列来避免此类问题。
摘要由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

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

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

同步

同步,就是协调步调,按照预定的先后次序进行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值