第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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() 輸出結(jié)果 最后一行是Doing No.108 Task... 可是我在loop4thread函數(shù)中寫了 在 task_num <100 才執(zhí)行啊, 為什么 task_num 溢出到 108 呢
查看完整描述

1 回答

?
慕尼黑的夜晚無繁華

TA貢獻(xiàn)1864條經(jīng)驗 獲得超6個贊

這是數(shù)據(jù)同步的問題, 需要改成這樣:

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()

你之前的代碼的問題: 假如現(xiàn)在task_num小于100(假設(shè)就是99), 執(zhí)行到lock.acquire()可能會因為其他線程已經(jīng)獲取鎖而block, 同時其它線程可能正要對task_numtask_num+=1操作, 等你lock.acquire()返回時task_num就已經(jīng)不是99了, 可能是100或更大的值.

改過之后的代碼目的就是在lock.acquire()返回后, 當(dāng)前線程獲取鎖再檢測task_num, 這期間其他線程會因為無法獲取鎖而block, 也就不會改變task_num的值.

查看完整回答
反對 回復(fù) 2019-03-01
  • 1 回答
  • 0 關(guān)注
  • 493 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號