博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可重入锁 RLOCK(转)
阅读量:7240 次
发布时间:2019-06-29

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

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

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

Python代码
  1. ''''' 
  2. Created on 2012-9-8 
  3.   
  4. @author: walfred 
  5. @module: thread.ThreadTest6 
  6. '''  
  7.   
  8. import threading  
  9. import time  
  10.    
  11. counter = 0  
  12. mutex = threading.Lock()  
  13.    
  14. class MyThread(threading.Thread):  
  15.     def __init__(self):  
  16.         threading.Thread.__init__(self)  
  17.       
  18.     def run(self):  
  19.         global counter, mutex  
  20.         time.sleep(1);  
  21.         if mutex.acquire():  
  22.             counter += 1  
  23.             print "I am %s, set counter:%s" % (self.name, counter)  
  24.             if mutex.acquire():  
  25.                 counter += 1  
  26.                 print "I am %s, set counter:%s" % (self.name, counter)  
  27.                 mutex.release()  
  28.             mutex.release()  
  29.       
  30. if __name__ == "__main__":  
  31.     for i in range(0200):  
  32.         my_thread = MyThread()  
  33.         my_thread.start()         

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

I am Thread-1, set counter:1

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

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

        代码只需将上述的:

Python代码
  1. mutex = threading.Lock()  

        替换成:

Python代码
  1. mutex = threading.RLock()  

        即可。

转载地址:http://huybm.baihongyu.com/

你可能感兴趣的文章
数据库发布订阅:发送邮件
查看>>
更改XML文件内容(发票管理软件)
查看>>
JVM 监控相关
查看>>
Mac下配置mnmp环境
查看>>
嘉兴婚庆业冷热不均 亟待一条龙服务
查看>>
转:Java中的StringTokenizer类的使用方法
查看>>
4、CommonChunkPlugin提取公共js-提取多个
查看>>
(八)Java 修饰符
查看>>
专家揭秘:STM32启动过程全解
查看>>
解决scrapy报错:ModuleNotFoundError: No module named 'win32api'
查看>>
js设计模式——5.状态模式
查看>>
团队冲刺第七天
查看>>
for循环
查看>>
pinpoint本地开发——collector
查看>>
vs2010磁盘空间不足
查看>>
115个Java面试题和答案——终极列表
查看>>
POJ1151 离散化求矩形面积的并
查看>>
Hdu 1730 Nim博弈
查看>>
秋冬咳嗽不吃药 12款民间偏方巧止咳
查看>>
PHP的搭建
查看>>