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遍历数组的方法小结
Apr 30 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
python中requests和https使用简单示例
Jan 18 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
如何把python项目部署到linux服务器
Aug 26 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
Python数据分析之绘图和可视化详解
Jun 02 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
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
js 程序执行与顺序实现详解
2013/05/13 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
Python 图片处理库exifread详解
2021/02/25 Python
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
医院党员公开承诺书
2014/08/30 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
会议接待欢迎标语
2014/10/08 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
Mysql Online DDL的使用详解
2021/05/20 MySQL