python 多线程下变量溢出
伊谢尔伦
伊谢尔伦 2017-04-17 13:54:19
[Python讨论组]

代码如下

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 呢

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(1)
PHP中文网

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

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的值.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号