python多线程共享全局变量及互斥锁问题解析

 喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦!

#!/usr/bin/env python3# -*- coding: utf-8 -*-
from threading import Thread
num = 0
def addnum():
    global num
    for i in range(1000):
        num += 1
    print(num)
if __name__ == '__main__':
    t1 = Thread(target=addnum)
    t2 = Thread(target=addnum)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print('主进程结束,num的值为:',num)

结果为:

10002000
主进程结束,num的值为: 2000

可以看到,两个线程间是共享了num的值。虽说多线程是共享同一块内存空间的,但是由于每个线程的执行时间是不确定的,都是由CPU来分配的,这就造成 在处理全局变量的时候,有可能线程t1和t2都同时对全局变量num进程操作,比如num原来是10,同时进程加1之 后,由于他们获取到的num值都是10,因此同时进行加1的时候就只能让num的值变为11,假如是当有一个线程在 对num进程操作时,另一个线程等待之前的线程操作完成再去操作的话就不会出现上面的情况。

下面的代码演示了CPU时间片切换的明显现象:

#!/usr/bin/env python3# -*- coding: utf-8 -*-
from threading import Thread
import time
list1 = []
def addnum(seq):
    global list1
    for i in seq:
        time.sleep(0.1) # 通过时间等待,可以清楚的看到时间片切换的痕迹
        list1.append(i)
if __name__ == '__main__&
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值