多线程的资源竞争问题复现以及互斥锁

在Python中多线程的创建、调用方式与Java基本一致。多线程可以共享全局变量,由此引出资源竞争而导致的问题。


#资源竞争导致的问题复现
import threading

num = 0

def work1():
    global num
    for i in range(1000000):#数要足够大才能显现出问题
        num += 1

def work2():
    global num
    for i in range(1000000):
        num += 1

if __name__ == "__main__":
    w1 = threading.Thread(target = work1)
    w2 = threading.Thread(target = work2)
    w1.start()
    w2.start()
    w1.join()
    w2.join()
    print(num)
#测试输出结果:

1629026

问题原因分析:

for循环执行次数比较小时输出结果正确,而次数一但多起来问题就会显现。

线程在CPU上一般是并发执行,在第一个线程执行时间很短时的情况下,CPU还没有进行线程执行权切换时就线程已经执行完毕退出,此时程序输出结果正确,一但线程执行时间变长就有可能就会导致线程1正在执行时CPU把执行权交给线程2,这样就会导致计算结果出现差错。

解决方案:

使用互斥锁,每次只允许一个进程获取、修改全局变量。

#使用线程锁解决线程的资源竞争问题
import threading

num = 0

def work1(lock):
    global num
    for i in range(1000000):
        lock.acquire()
        num += 1
        lock.release()

def work2(lock):
    global num
    for i in range(1000000):
        lock.acquire()
        num += 1
        lock.release()

if __name__ == "__main__":
    lock = threading.Lock()
    w1 = threading.Thread(target = work1,args = (lock,))
    w2 = threading.Thread(target = work2,args = (lock,))
    w1.start()
    w2.start()
    w1.join()
    w2.join()
    print(num)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值