代码如下
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_num做task_num+=1操作, 等你lock.acquire()返回时task_num就已经不是99了, 可能是100或更大的值.
改过之后的代码目的就是在lock.acquire()返回后, 当前线程获取锁再检测task_num, 这期间其他线程会因为无法获取锁而block, 也就不会改变task_num的值.
添加回答
举报
0/150
提交
取消
