一、死锁

简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况。

1、迭代死锁

该情况是一个线程“迭代”请求同一个资源,直接就会造成死锁:

import threading

import time

class MyThread(threading.Thread):

def run(self):

global num

time.sleep(1)

if mutex.acquire(1):

num = num+1

msg = self.name+' set num to '+str(num)

print msg

mutex.acquire()

mutex.release()

mutex.release()

num = 0

mutex = threading.Lock()

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

上例中,在run函数的if判断中第一次请求资源,请求后还未 release ,再次acquire,最终无法释放,造成死锁。这里例子中通过将print下面的两行注释掉就可以正常执行了 ,除此之外也可以通过可重入锁解决,后面会提到。

2、互相调用死锁

上例中的死锁是在同一个def函数内多次调用造成的,另一种情况是两个函数中都会调用相同的资源,互相等待对方结束的情况。如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

import threading

import time

class MyThread(threading.Thread):

def do1(self):

global resA, resB

if mutexA.acquire():

msg = self.name+' got resA'

print msg

if mutexB.acquire(1):

msg = self.name+' got resB'

print msg

mutexB.release()

mutexA.release()

def do2(self):

global resA, resB

if mutexB.acquire():

msg = self.name+' got resB'

print msg

if mutexA.acquire(1):

msg = self.name+' got resA'

print msg

mutexA.release()

mutexB.release()

def run(self):

self.do1()

self.do2()

resA = 0

resB = 0

mutexA = threading.Lock()

mutexB = threading.Lock()

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

这个死锁的示例稍微有点复杂。具体可以理下。

二、可重入锁

为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。这里以例1为例,如果使用RLock代替Lock,则不会发生死锁:

import threading

import time

class MyThread(threading.Thread):

def run(self):

global num

time.sleep(1)

if mutex.acquire(1):

num = num+1

msg = self.name+' set num to '+str(num)

print msg

mutex.acquire()

mutex.release()

mutex.release()

num = 0

mutex = threading.RLock()

def test():

for i in range(5):

t = MyThread()

t.start()

if __name__ == '__main__':

test()

和例1不同之处在于threading.Lock()换成了threading.RLock() 。

python threading lock_python threading之死锁和可重入锁相关推荐

  1. python多线程编程(4): 死锁和可重入锁

    From: http://www.cnblogs.com/holbrook/archive/2012/03/08/2385449.html 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并 ...

  2. java代码如何避免死锁,Java可重入锁如何避免死锁

    看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...

  3. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

  4. python学习笔记-死锁与递归锁(可重入锁)

    本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写 本文目录 死锁 递归锁(可重入锁) 代码实现 死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成 ...

  5. python锁有哪几种_python 可重入锁有什么用?

    可重入锁:支持在同一线程中多次请求同一资源 import threading import time class MyThread(threading.Thread): def run(self): ...

  6. python限制进程数_Python连载36-线程数量限制、Timer、可重入锁

    一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 importthreadingimporttime#参数定义了最多几 ...

  7. 重入锁、死锁、活锁、公平非公平锁……一下子都给你屡清楚了

    目录 写在前面 重入锁 线程饥饿死锁 死锁 活锁(Livelock) 公平锁非公平锁 互斥锁 读-写锁 写在前面 每当听公司大佬提起来,死锁.活锁.公平锁.非公平锁--自己也是知其然而不知其所以然. ...

  8. java重入锁 自旋锁_java 自旋锁(可重入且无死锁)

    java自旋锁 的实现原理:如果自旋锁被另外一个线程对象持有,那么当前获取锁的线程将陷入while循环等待,直到那个持有自旋锁的线程对象释放它所持有的自旋锁,那么那些想要获取该自旋锁的线程对象 将会有 ...

  9. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

最新文章

  1. 解析postgresql 删除重复数据案例
  2. 面试官问一个数据表字段怎么表示多种业务含义?我愣了五分钟
  3. 普通计算机怎么算根号_大学专业介绍 | 计算机专业的真实就业情况
  4. Problem A: 删除区间内的元素(线性表)
  5. python汉字排序规则_Python 中文排序
  6. a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
  7. OpenGL--天空盒
  8. 正则表达式中的?表示匹配前面的正则表达式0次或者1次
  9. 思维导图c语言java区别_C语言基本数据类型的思维导图
  10. X线、CT、B超、核磁共振区别
  11. linux防火墙放开pptpd端口号,centos7 安装pptpd(使用iptbales防火墙)
  12. 2022.7.2新版码易支付源码+三网免签挂+APP监控在线更新
  13. Tomcat安装及配置详解
  14. 交易系统开发工程师交易系统开发工程师 - 借此地,招几个人。
  15. 杭州中学2021高考成绩查询,2020年杭州各高中高考成绩排名及放榜最新消息
  16. Win10微信查看图片卡顿或发送图片卡顿的原因和解决方法
  17. 副业案例-晴矢分享 短视频MCN亏损500W的总结的血泪经验
  18. 四、RNN模型 与 NLP应用 —— Stacked RNN
  19. 蘑菇导航源码安装教程,wordpress导航主题免费下载[Wordpress主题]
  20. 面试初体验:经历七场面试大数据开发工程师岗位总结(一)

热门文章

  1. 你知道Material Type(ROH,HALB,FERT…)为什么缩写是ROH,HALB,FERT吗?哈哈哈
  2. 在ABAP中将负号提前的方法
  3. 做好新型冠状病毒防疫 |春节第一重任:说服爸妈带口罩
  4. 睡眠经济的尽头,会是智能床垫吗?
  5. linux虚拟化毕业设计,毕业设计(论文)-基于Linux的云校园桌面虚拟化系统的设计与实现(68页)-原创力文档...
  6. Python三元运算
  7. Python 基础中20 个小技巧
  8. Python 读取 csv 文件忽略引号中字段的逗号
  9. Python基础语法精心总结!看完都知道的可以往下继续学习了
  10. 一个aov网用邻接矩阵表示_关注讲述我和朱婷7年7个故事,见证一个明星代表的诞生...