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 生成不重复的随机数的代码
May 15 Python
wxPython实现窗口用图片做背景
Apr 25 Python
详解Django中类视图使用装饰器的方式
Aug 12 Python
Python 打印中文字符的三种方法
Aug 14 Python
python3 拼接字符串的7种方法
Sep 12 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
Python os.access()用法实例
Feb 18 Python
python实现雪花飘落效果实例讲解
Jun 18 Python
Python调用C语言的实现
Jul 26 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
jupyter notebook中新建cell的方法与快捷键操作
Apr 22 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
php图像验证码生成代码
2017/06/08 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
php获取微信openid方法总结
2019/10/10 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
python 图片验证码代码分享
2012/07/04 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Python如何读写CSV文件
2020/08/13 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
SQL Server面试题
2016/10/17 面试题
C#面试题
2016/05/06 面试题
企业元宵节主持词
2014/03/25 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
Nginx限流和黑名单配置
2022/05/20 Servers