为了账号安全,请及时绑定邮箱和手机立即绑定

python 多线程下变量溢出

python 多线程下变量溢出

慕森王 2019-02-26 10:41:33
代码如下 python#!/usr/bin/env python # -*- coding: utf-8 -*- import socket,time,threading task_num=0 lock = threading.Lock() def loop4thread(): global task_num while task_num < 100: lock.acquire() try: print "%s Doing NO.%d Task..." %(threading.current_thread().name , task_num) task_num+=1 finally: lock.release() onethread=[ 0 for x in range(10)] for i in range(10) : onethread[i] = threading.Thread(target=loop4thread,name="Threadloop"+str(i)) onethread[i].start() 输出结果 最后一行是Doing No.108 Task... 可是我在loop4thread函数中写了 在 task_num <100 才执行啊, 为什么 task_num 溢出到 108 呢
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

这是数据同步的问题, 需要改成这样:

def loop4thread():
    global task_num
    while True:
        lock.acquire()

        if task_num >= 100:
            lock.release()
            break

        try:
            print "%s Doing NO.%d Task..." %(threading.current_thread().name , task_num)
            task_num+=1
        finally:
            lock.release()

你之前的代码的问题: 假如现在task_num小于100(假设就是99), 执行到lock.acquire()可能会因为其他线程已经获取锁而block, 同时其它线程可能正要对task_numtask_num+=1操作, 等你lock.acquire()返回时task_num就已经不是99了, 可能是100或更大的值.

改过之后的代码目的就是在lock.acquire()返回后, 当前线程获取锁再检测task_num, 这期间其他线程会因为无法获取锁而block, 也就不会改变task_num的值.

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 481 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信