代碼如下
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_num
做task_num+=1
操作, 等你lock.acquire()
返回時task_num
就已經(jīng)不是99了, 可能是100或更大的值.
改過之后的代碼目的就是在lock.acquire()
返回后, 當(dāng)前線程獲取鎖再檢測task_num
, 這期間其他線程會因為無法獲取鎖而block, 也就不會改變task_num
的值.
添加回答
舉報
0/150
提交
取消