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使用百度翻译进行中翻英示例
Apr 14 Python
Python实现建立SSH连接的方法
Jun 03 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
答题辅助python代码实现
Jan 16 Python
实例讲解Python爬取网页数据
Jul 08 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python函数的万能参数传参详解
Jul 26 Python
python实现图片上添加图片
Nov 26 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
python三子棋游戏
May 04 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
python中的sort方法使用详解
2014/07/25 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
十佳教师事迹材料
2014/01/11 职场文书
留守儿童工作方案
2014/06/02 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
公司承诺书格式范文
2015/04/28 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
python实现自定义日志的具体方法
2021/05/28 Python
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL