|
|
发表于 2020-10-21 09:54:01
|
显示全部楼层
本帖最后由 suchocolate 于 2020-10-21 10:08 编辑
1)Lock是锁定共享的全局变量,某线程使用时不让其他线程修改,其他线程想修改得等待线程用完,为的是数据的唯一性,并不是所谓的‘锁cpu线程切换’。
2)你的代码循环间隙就释放了锁,别的线程会抢间隙时间修改,要改成这样:- def run(self):
- lock.acquire() # 上锁,上锁后禁止其他线程访问
- for item in range(self.n):
- sum1.sum += 1
- print(sum1.sum)
- lock.release() # 开锁,允许其他线程访问
复制代码 3)‘多把锁’没有意义,想保持数据的唯一性,就得用一把锁。线程锁是君子协定,如果有的线程错配置没有用同一把锁,是可以修改的,这就会造成混乱。打个比方,现在有2个线程:线程A和线程B。
- 线程A从0循环1000次加1,sum已经累加到500了。
- 线程B突然出现,它算了一次,结果sum=0+1,sum变成了1。
- 线程A再读取,基数就变成了1,线程A已经循环500次了,它对sum是无感知的,还会继续累加500次。
- 如果线程B不再打扰线程A,那么结果就是501,如果线程B还会打扰,结果就难料了。
实际场景就是上述场景的疯狂版,多个线程,无序乱抢占,结果就是你的代码输出结果总在变,正常应该输出100000,200000,300000。
4)另外建议join()用上,然后循环方式建立多个线程:
- if __name__ == '__main__':
- lock = Lock()
- t_l = []
- n = 10000
- for i in range(3):
- t = sum1(n)
- t_l.append(t)
- t.start()
- for t in t_l:
- t.join()
复制代码
|
|