Python:使用threading模块实现多线程编程六[可重入锁RLock]
来源:互联网 发布:初学px4之飞控算法 编辑:程序博客网 时间:2024/05/22 01:09
考虑这种情况:如果一个线程遇到锁嵌套的情况该怎么办,这个嵌套是指当我一个线程在获取临界资源时,又需要再次获取。
根据这种情况,代码如下:
Python代码
- '''''
- 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,则不会发生死锁:
代码只需将上述的:
Python代码
- mutex = threading.Lock()
替换成:
Python代码
- mutex = threading.RLock()
即可。
声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自:Python:使用threading模块实现多线程编程六[可重入锁RLock]
- Python:使用threading模块实现多线程编程六[可重入锁RLock]
- Python:使用threading模块实现多线程编程六[可重入锁RLock]
- Python多线程编程(threading ):使用Lock互斥锁RLock
- Python:使用threading模块实现多线程编程
- Python:使用threading模块实现多线程编程
- Python:使用threading模块实现多线程编程一[综述]
- Python:使用threading模块实现多线程编程一[综述]
- [Python module]使用threading模块实现多线程编程一[综述]
- Python:使用threading模块实现多线程
- Python:使用threading模块实现多线程
- Python:使用threading模块实现多线程
- py 使用threading模块实现多线程编程
- Python:使用threading模块实现多线程编程三[threading.Thread类的重要函数]
- Python:使用threading模块实现多线程编程三[threading.Thread类的重要函数]
- python的threading模块中threading.RLock和threading.Lock
- python多线程编程----threading模块
- Python 多线程编程threading模块
- [Python]多线程--threading模块实现
- Python:使用threading模块实现多线程编程五[死锁的形成]
- C中16进制与10进制互转
- 完美解读Linux中文件系统的目录结构
- 保证oracle数据库只有一个会话(1)
- Nginx 日志文件切割
- Python:使用threading模块实现多线程编程六[可重入锁RLock]
- 强引用 软引用 弱引用 虚引用
- Windows Server 2003 安全配置
- Python:使用threading模块实现多线程编程七[使用Condition实现复杂同步]
- Cygwin 下载Android源码
- Python:使用threading模块实现多线程编程八[使用Event实现线程间通信]
- TCP_IP和OSI模型以及每层主要包括的主要协议
- Javascript MVC架构之旅
- linux下使用串口终端C-kermint连接飞凌OK6410开发板