Lock()与RLock()锁

2023-05-16

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁
也可能导致读写混乱

锁提供如下方法:
1.Lock.acquire([blocking])
2.Lock.release()
3.threading.Lock() 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取

4.threading.RLock() 多重锁,在同一线程中可用被多次acquire。如果使用RLock,那么acquire和release必须成对出现,
调用了n次acquire锁请求,则必须调用n次的release才能在线程中释放锁对象

例如:
无锁:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
global num
time.sleep(1)
num +=i
print num

print '%s thread start!'%(time.ctime())

try:
for i in range(6):
t =threading.Thread(target=sum_num,args=(i,))
t.start()

except KeyboardInterrupt,e:
print "you stop the threading"

print '%s thread end!'%(time.ctime())
输出:

Sun May 28 20:54:59 2017 thread start!
Sun May 28 20:54:59 2017 thread end!
01
3
710
15
1
2
3
4
5
6

  

结果显示混乱

引入锁:

#coding=utf8
import threading
import time

num = 0

def sum_num(i):
lock.acquire()
global num
time.sleep(1)
num +=i
print num
lock.release()

print '%s thread start!'%(time.ctime())

try:
lock=threading.Lock()
list = []
for i in range(6):
t =threading.Thread(target=sum_num,args=(i,))
list.append(t)
t.start()

for threadinglist in list:
threadinglist.join()

except KeyboardInterrupt,e:
print "you stop the threading"

print '%s thread end!'%(time.ctime())

  

结果:

Sun May 28 21:15:37 2017 thread start!
0
1
3
6
10
15
Sun May 28 21:15:43 2017 thread end!
其中:
lock=threading.Lock()加载锁的方法也可以换成lock=threading.RLock()

如果将上面的sum_num修改为:

lock.acquire()
global num
lock.acquire()
time.sleep(1)
num +=i
lock.release()
print num
lock.release()
那么:
lock=threading.Lock() 加载的锁,则一直处于等待中,锁等待
而lock=threading.RLock() 运行正常

转载于:https://www.cnblogs.com/yoyo1216/p/10129761.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lock()与RLock()锁 的相关文章

随机推荐

  • for i in enumerate(): 解析

    总而言之enumerate就是枚举的意思 xff0c 把元素一个个列举出来 xff0c 第一个是什么 xff0c 第二个是什么 xff0c 所以他返回的是元素以及对应的索引 line span class token operator 61
  • cv.threshold()浅谈

    threshold xff0c 是 阈值 临界值 门槛 的意思 其模糊一点的原理就是 xff1a 对数值与阈值进行比较 xff0c 针对比较结果 结果是指 xff1a 高 xff0c 还是低 xff0c 其中在本人的阅历中没有等于 xff0
  • 人工智能基础——什么是智能(智能的特征)

    智能的概念 xff1a 智能及智能的本质是古今中外许多哲学家 脑科学家一直在努力探索和研究的问题 xff0c 但至今任然没有完全了解 不过生成了以下几种学派 xff1a 1 思维理论 xff1a 认为智能是思维的核心 2 知识阈值理论 xf
  • 人工智能基础——知识的表示方法,一阶谓词逻辑表示法

    知识的表示 xff1a 就是将人类的知识形式化 xff08 符号 xff09 或模型化 xff08 结构 xff09 这样有利于 xff1a 对知识的组织维护与管理 便于对知识的增删改查 表示方法 xff1a 一阶谓词逻辑表示法 命题 xf
  • 最优化理论基础与方法学习笔记——凸集与凸函数以及手写定理证明

    文章目录 凸集的定义凸集的几何意义有关凸集的定理 定理1 4 2内点 边界点和闭包的定义定义1 4 3 超平面的定义定理1 4 3 投影定理定理1 4 4 点与凸集的分离定理定理1 4 5 支撑超平面定理定义1 4 4 凸函数的定义定义1
  • 人工智能基础——知识的表示方法,语义网络表示方法

    语义网络 以个体为中心的组织知识的语义联系实例联系泛化联系聚集联系属性联系 以谓词或关系为中心组织知识的语义联系以关系 xff08 谓词 xff09 为中心组织知识的语义联系连接词在语义网络中的表示方法合取析取否定蕴含 变元和量词在语义网络
  • Ubuntu学习笔记——隐藏文件

    在Linux中 xff0c 隐藏文件可以用 ls a来查看 隐藏文件是 filename 的形式的
  • 概率论与数理统计学习笔记——参数估计

    参数估计 xff1a 估计参数 方法 xff1a 据估计法 极大似然法 矩估计法 xff1a 样本矩等于总体矩 xff08 当样本容量很大时 xff09 xff0c 总体矩就是我们所说的期望 xff0c 比如k阶总体矩就是X的k次方 xff
  • CMakeList.txt/Clion中添加头文件和库

    cmake minimum required VERSION 3 6 project capi lua include directories usr include find library LUALIB lua usr lib set
  • 人工智能基础——谓词公式化为子句集的方法

    谓词公式化为子句集 基本定义谓词公式化为子句集的步骤定理3 1 基本定义 谓词公式化为子句集的步骤 定理3 1 基本定义 原子谓词公式 xff1a 一个不能够再分解的命题 原子谓词公式及其否定统称为文字 xff0c P称为正文字 P称为负文
  • Ubuntu学习笔记——磁盘以及磁盘分区和文件系统

    磁盘 磁盘分区和文件系统 磁盘格式化磁盘设备命名使用命令行工具管理磁盘分区和文件系统 磁盘格式化 磁盘设备命名 使用命令行工具管理磁盘分区和文件系统 磁盘格式化 xff1a 低级格式化 xff1a 空白磁盘划分柱面 分区以及磁道 高级格式化
  • 几何分布的期望推导

    推导过程
  • CRC循环冗余校验纠错中循环左移的原因以及一些新感受

    CRC循环冗余校验纠错中循环左移的原因以及一些新感受 问题的描述理解已知前提左移的需求背景 xff1a 为什么需要左移 新知 问题的描述 理解 已知前提 1 我们讨论的是只有一位代码出错的情况 xff0c 多位出错的情况由于 纠错代价过大而
  • 把在forward函数里面添加的层放到GPU中

    把在forward函数里面添加的层放到GPU中 问题描述问题解决 问题描述 借鉴GoogleNet和NiN的思想 xff0c 我想在Inception最后在添加两个卷积全连接层 xff0c 但是这样子写会报错 xff0c 说是final这层
  • 自己创建XXConfig.cmake文件

    创建自定义的XXConfig cmake文件 xff1a 我们在使用cmake进行代码构建的时候 xff0c 当需要通过find package XXX 来配置相关库的路径 xff08 头文件路径 链接库路径 xff09 的时候 xff0c
  • ucosII的书籍

  • ROS中在一个功能包中导入另一个功能包的python模块

    目录 1 引言 2 创建一个功能包 3 安装功能包到ROS环境 3 1 编辑CMakeLists txt 3 2 编辑setup py 3 3 安装到ROS环境 4 模块导入 4 1 创建验证功能包 4 2 编译工作空间 4 3 运行ros
  • Android技巧:学习使用GridLayout

    GridLayout是一个非常强大的网格类布局 xff0c 它不但能像TableLayout那样 xff0c 实现网格类布局 xff0c 但它更为强大的地方在于每个Cell的大小可以横向或者纵向拉伸 xff0c 每个Cell的对齐方式也有很
  • 说说Android的MVP模式

    更多精彩博客 安卓应用开发是一个看似容易 xff0c 实则很难的一门苦活儿 上手容易 xff0c 看几天Java xff0c 看看四大组件咋用 xff0c 就能整出个不太难看的页面来 但是想要做好 xff0c 却是很难 系统框架和系统组件封
  • Lock()与RLock()锁

    资源总是有限的 xff0c 程序运行如果对同一个对象进行操作 xff0c 则有可能造成资源的争用 xff0c 甚至导致死锁 也可能导致读写混乱 锁提供如下方法 xff1a 1 Lock acquire blocking 2 Lock rel