博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程锁Lock
阅读量:6157 次
发布时间:2019-06-21

本文共 1013 字,大约阅读时间需要 3 分钟。

from threading import Thread, Lockimport timedef func():    global n    n -= 1n = 10t_list = []for i in range(10):    t = Thread(target=func,)    t_list.append(t)    t.start()for t in t_list:    t.join()print(n)

这段代码结果我们知道,因为GIL的原因,结果是0

再看如下代码:

from threading import Thread, Lockimport timedef func():    global n    temp = n    time.sleep(0.1)    n = temp - 1n = 10t_list = []for i in range(10):    t = Thread(target=func,)    t_list.append(t)    t.start()for t in t_list:    t.join()print(n)

打印结果却是9

为什么呢?

因为在0.1秒之内,所有线程肯定都进来了,但是需要睡0.1秒,这就是阻塞状态,他们会把手里的数据让给其他线程,所以每个线程的temp都是10,阻塞结束,10减1全变成9都写入内存,最终n的值就是9了,这样就导致数据的不安全了。

怎么改进?加锁就可以了

from threading import Thread, Lockimport timedef func(lock):    lock.acquire()    global n    temp = n    time.sleep(0.1)    n = temp - 1    lock.release()lock =Lock()n = 10t_list = []for i in range(10):    t = Thread(target=func, args=(lock,))    t_list.append(t)    t.start()for t in t_list:    t.join()print(n)

这样打印的结果就是0了。

 

转载于:https://www.cnblogs.com/aaronthon/p/9851743.html

你可能感兴趣的文章
从 保龄球得分计算方法 浅析 深度学习
查看>>
leetcode 41. First Missing Positive
查看>>
优雅地在Mac+Valet环境下本地部署phphub
查看>>
开发之路(设计模式二:观察者模式)
查看>>
Theano - 更多的例子
查看>>
Spring Boot & Spring MVC 异常处理的N种方法
查看>>
webpack - 收藏集 - 掘金
查看>>
node.js - 收藏集 - 掘金
查看>>
Golang中WaitGroup、Context、goroutine定时器及超时学习笔记
查看>>
css H5端多行文本实现省略号
查看>>
leetcode15 3Sum 从数组中找到三个整数,它们的和为0
查看>>
UIView 动画进阶
查看>>
service worker之cache实践--sw-precache
查看>>
MySQL成勒索新目标,数据服务基线安全问题迫在眉睫
查看>>
Java程序员之完美代码
查看>>
前端常见算法的JS实现
查看>>
JavaScript 是传值调用还是传引用调用?
查看>>
超级围棋AI ELF OpenGo全面开源!FAIR田渊栋揭秘训练过程
查看>>
敏捷世界中的合规性
查看>>
如何在Kubernetes上运行Apache Flink
查看>>