Python多线程编程(五):死锁的形成


Posted in Python onApril 05, 2015

前一篇文章Python:使用threading模块实现多线程编程四[使用Lock互斥锁]我们已经开始涉及到如何使用互斥锁来保护我们的公共资源了,现在考虑下面的情况?

如果有多个公共资源,在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,这会引起什么问题?

死锁概念

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

''' 

Created on 2012-9-8 

 

@author: walfred 

@module: thread.TreadTest5 

'''   

import threading  

 

counterA = 0  

counterB = 0  

 

mutexA = threading.Lock()  

mutexB = threading.Lock()  

 

class MyThread(threading.Thread):  

    def __init__(self):  

        threading.Thread.__init__(self)  

 

    def run(self):  

        self.fun1()  

        self.fun2()  

 

    def fun1(self):  

        global mutexA, mutexB  

        if mutexA.acquire():  

            print "I am %s , get res: %s" %(self.name, "ResA")  

 

            if mutexB.acquire():  

                print "I am %s , get res: %s" %(self.name, "ResB")  

                mutexB.release()  

 

        mutexA.release()   

 

    def fun2(self):  

        global mutexA, mutexB  

        if mutexB.acquire():  

            print "I am %s , get res: %s" %(self.name, "ResB")  

 

            if mutexA.acquire():  

                print "I am %s , get res: %s" %(self.name, "ResA")  

                mutexA.release()  

 

        mutexB.release()   

 

if __name__ == "__main__":  

    for i in range(0, 100):  

        my_thread = MyThread()  

        my_thread.start()

代码中展示了一个线程的两个功能函数分别在获取了一个竞争资源之后再次获取另外的竞争资源,我们看运行结果:

I am Thread-1 , get res: ResA

I am Thread-1 , get res: ResB

I am Thread-2 , get res: ResAI am Thread-1 , get res: ResB

可以看到,程序已经挂起在那儿了,这种现象我们就称之为”死锁“。

避免死锁

避免死锁主要方法就是:正确有序的分配资源,避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法。

Python 相关文章推荐
详细解析Python中__init__()方法的高级应用
May 11 Python
Python制作Windows系统服务
Mar 25 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
详解python中的time和datetime的常用方法
Jul 08 Python
python 直接赋值和copy的区别详解
Aug 07 Python
pycharm运行scrapy过程图解
Nov 22 Python
python 类之间的参数传递方式
Dec 20 Python
python实现简单飞行棋
Feb 06 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python实现mean-shift聚类算法
Jun 10 Python
浅析Python 多行匹配模式
Jul 24 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
Python中使用logging模块打印log日志详解
Apr 05 #Python
You might like
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
功能强大的php文件上传类
2016/08/29 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
Javascript this指针
2009/07/30 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python实现读取命令行参数的方法
2015/05/22 Python
Python调用C++程序的方法详解
2017/01/24 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
python 元组和列表的区别
2020/12/30 Python
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
我的梦中国梦演讲稿
2014/04/23 职场文书
关于建议书的格式范文
2014/05/20 职场文书
新闻发布会策划方案
2014/06/12 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
详解MySQL中的pid与socket
2021/06/15 MySQL