Python多线程编程(六):可重入锁RLock


Posted in Python onApril 05, 2015

考虑这种情况:如果一个线程遇到锁嵌套的情况该怎么办,这个嵌套是指当我一个线程在获取临界资源时,又需要再次获取。

根据这种情况,代码如下:

''' 

Created on 2012-9-8 

 

@author: walfred 

@module: thread.ThreadTest6 

'''  

 

import threading  

import time  

 

counter = 0  

mutex = threading.Lock()  

 

class MyThread(threading.Thread):  

    def __init__(self):  

        threading.Thread.__init__(self)  

 

    def run(self):  

        global counter, mutex  

        time.sleep(1);  

        if mutex.acquire():  

            counter += 1  

            print "I am %s, set counter:%s" % (self.name, counter)  

            if mutex.acquire():  

                counter += 1  

                print "I am %s, set counter:%s" % (self.name, counter)  

                mutex.release()  

            mutex.release()  

 

if __name__ == "__main__":  

    for i in range(0, 200):  

        my_thread = MyThread()  

        my_thread.start()

这种情况的代码运行情况如下:

I am Thread-1, set counter:1

之后就直接挂起了,这种情况形成了最简单的死锁。

那有没有一种情况可以在某一个线程使用互斥锁访问某一个竞争资源时,可以再次获取呢?在Python中为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

代码只需将上述的:

mutex = threading.Lock()

替换成:
mutex = threading.RLock()

即可。
Python 相关文章推荐
python win32 简单操作方法
May 25 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
解决python 输出是省略号的问题
Apr 19 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
关于python字符串方法分类详解
Aug 20 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
Django模型中字段属性choice使用说明
Mar 30 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python自动化发送邮件实例讲解
Jan 04 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 Python
Python多线程编程(五):死锁的形成
Apr 05 #Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 #Python
Python多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 #Python
Python多线程编程(二):启动线程的两种方法
Apr 05 #Python
Python多线程编程(一):threading模块综述
Apr 05 #Python
Python中使用dom模块生成XML文件示例
Apr 05 #Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 #Python
You might like
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
跟我学Laravel之路由
2014/10/15 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
koa-router源码学习小结
2018/09/07 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
在Python中使用成员运算符的示例
2015/05/13 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python中标准模块importlib详解
2017/04/16 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Django权限设置及验证方式
2020/05/13 Python
python能做哪方面的工作
2020/06/15 Python
深入了解NumPy 高级索引
2020/07/24 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
房地产开盘策划方案
2014/02/10 职场文书
教师现实表现材料
2014/02/14 职场文书
党支部对转正的意见
2015/06/02 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python