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实现问号表达式(?)的方法
Nov 27 Python
Python实现翻转数组功能示例
Jan 12 Python
Python Requests库基本用法示例
Aug 20 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
python删除csv文件的行列
Apr 06 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 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
简单的页面缓冲技术
2006/10/09 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
JQuery触发事件例如click
2013/09/11 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python帮你识破双11的套路
2019/11/11 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
怎样填写就业意向
2014/04/02 职场文书
公司贷款承诺书
2014/05/30 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
奔腾年代观后感
2015/06/09 职场文书
开业典礼致辞
2015/07/29 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL